diff options
Diffstat (limited to 'sw')
373 files changed, 5073 insertions, 4736 deletions
diff --git a/sw/AllLangResTarget_sw.mk b/sw/AllLangResTarget_sw.mk index 1e21ccaae48c..20d6829a9a58 100644 --- a/sw/AllLangResTarget_sw.mk +++ b/sw/AllLangResTarget_sw.mk @@ -109,6 +109,7 @@ $(eval $(call gb_SrsTarget_add_files,sw/res,\ sw/source/ui/dialog/wordcountdialog.src \ sw/source/ui/dochdl/dochdl.src \ sw/source/ui/dochdl/selglos.src \ + sw/source/ui/docvw/annotation.src \ sw/source/ui/docvw/access.src \ sw/source/ui/docvw/docvw.src \ sw/source/ui/envelp/envelp.src \ diff --git a/sw/JunitTest_sw_complex.mk b/sw/JunitTest_sw_complex.mk index 4eb0dc405264..df81b22f712d 100755 --- a/sw/JunitTest_sw_complex.mk +++ b/sw/JunitTest_sw_complex.mk @@ -27,6 +27,11 @@ $(eval $(call gb_JunitTest_JunitTest,sw_complex)) +$(eval $(call gb_JunitTest_set_defs,sw_complex,\ + $$(DEFS) \ + -Dorg.openoffice.test.arg.tdoc=$(SRCDIR)/sw/qa/complex/writer/testdocuments \ +)) + $(eval $(call gb_JunitTest_add_sourcefiles,sw_complex,\ sw/qa/complex/checkColor/CheckChangeColor \ sw/qa/complex/indeterminateState/CheckIndeterminateState \ @@ -52,6 +57,14 @@ $(eval $(call gb_JunitTest_add_jars,sw_complex,\ $(eval $(call gb_JunitTest_add_classes,sw_complex,\ complex.accessibility.AccessibleRelationSet \ complex.checkColor.CheckChangeColor \ + complex.writer.CheckCrossReferences \ + complex.writer.CheckFlies \ + complex.writer.CheckIndexedPropertyValues \ + complex.writer.CheckNamedPropertyValues \ + complex.writer.TextPortionEnumerationTest \ )) +# currently fails (should run again in os146) (except on windows) +# complex.writer.CheckBookmarks \ + # vim: set noet sw=4 ts=4: diff --git a/sw/inc/IDocumentLayoutAccess.hxx b/sw/inc/IDocumentLayoutAccess.hxx index 7593aa670a99..0e995e857650 100644 --- a/sw/inc/IDocumentLayoutAccess.hxx +++ b/sw/inc/IDocumentLayoutAccess.hxx @@ -31,6 +31,7 @@ #include <swtypes.hxx> +class ViewShell; class SwRootFrm; class SwFrmFmt; class SfxItemSet; @@ -45,12 +46,15 @@ public: /** Returns the layout set at the document. */ - virtual const SwRootFrm* GetRootFrm() const = 0; - virtual SwRootFrm* GetRootFrm() = 0; + virtual const ViewShell* GetCurrentViewShell() const = 0; + virtual ViewShell* GetCurrentViewShell() = 0; //swmod 071107//swmod 071225 + virtual const SwRootFrm* GetCurrentLayout() const = 0; + virtual SwRootFrm* GetCurrentLayout() = 0; //swmod 080218 + virtual bool HasLayout() const = 0; /** !!!The old layout must be deleted!!! */ - virtual void SetRootFrm( SwRootFrm* pNew ) = 0; + virtual void SetCurrentViewShell( ViewShell* pNew ) = 0; //swmod 071107//swmod 071225 /** */ diff --git a/sw/inc/authfld.hxx b/sw/inc/authfld.hxx index ebac43554a44..c11769d08912 100644 --- a/sw/inc/authfld.hxx +++ b/sw/inc/authfld.hxx @@ -81,13 +81,15 @@ class SW_DLLPUBLIC SwAuthorityFieldType : public SwFieldType // @@@ private copy assignment, but public copy ctor? @@@ const SwAuthorityFieldType& operator=( const SwAuthorityFieldType& ); +protected: +virtual void Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew ); + public: SwAuthorityFieldType(SwDoc* pDoc); SwAuthorityFieldType( const SwAuthorityFieldType& ); ~SwAuthorityFieldType(); virtual SwFieldType* Copy() const; - virtual void Modify( SfxPoolItem *pOld, SfxPoolItem *pNew ); virtual bool QueryValue( com::sun::star::uno::Any& rVal, sal_uInt16 nWhichId ) const; virtual bool PutValue( const com::sun::star::uno::Any& rVal, sal_uInt16 nWhichId ); diff --git a/sw/inc/calbck.hxx b/sw/inc/calbck.hxx index e778e0366007..09d6fcbff3ed 100644 --- a/sw/inc/calbck.hxx +++ b/sw/inc/calbck.hxx @@ -26,140 +26,160 @@ * ************************************************************************/ -/************************************************************* -#* service classes - *************************************************************/ - -/* - * When an attribute in a format is changed, this change has to be propagated - * to all dependent formats and over them to all concerned nodes. - * In doing so it has to be decided whether the change can have an effect or - * whether the dependent format redefines the changed attribute (such that the - * attribute value of the dependent format occludes the changed value). - * Furthermore, the concerned node can decide whether it makes use of the - * changed attribute (for example: line distance for underlining was changed, - * but the underlining attribute was not used). This way, the minimal effort - * for reformatting is identified. - */ #ifndef _CALBCK_HXX #define _CALBCK_HXX #include <tools/rtti.hxx> #include "swdllapi.h" +#include <boost/noncopyable.hpp> class SwModify; class SwClientIter; class SfxPoolItem; -class SvStream; +class SfxHint; + +/* + SwModify and SwClient cooperate in propagating attribute changes. + If an attribute changes, the change is notified to all dependent + formats and other interested objects, e.g. Nodes. The clients will detect + if the change affects them. It could be that the changed attribute is + overruled in the receiving object so that its change does not become + effective or that the receiver is not interested in the particular attribute + in general (though probably in other attributes of the SwModify object they + are registered in). + As SwModify objects are derived from SwClient, they can create a chain of SwClient + objects where changes can get propagated through. + Each SwClient can be registered at only one SwModify object, while each SwModify + object is connected to a list of SwClient objects. If an object derived from SwClient + wants to get notifications from more than one SwModify object, it must create additional + SwClient objects. The SwDepend class allows to handle their notifications in the same + notification callback as it forwards the Modify() calls it receives to a "master" + SwClient implementation. + The SwClientIter class allows to iterate over the SwClient objects registered at an + SwModify. For historical reasons its ability to use TypeInfo to restrict this iteration + to objects of a particular type created a lot of code that misuses SwClient-SwModify + relationships that basically should be used only for Modify() callbacks. + This is still subject to refactoring. + Until this gets resolved, new SwClientIter base code should be reduced to the absolute + minimum and it also should be wrapped by SwIterator templates that prevent that the + code gets polluted by pointer casts (see switerator.hxx). + */ // ---------- // SwClient // ---------- -class SW_DLLPUBLIC SwClient +class SW_DLLPUBLIC SwClient : ::boost::noncopyable { + // avoids making the details of the linked list and the callback method public friend class SwModify; friend class SwClientIter; - SwClient *pLeft, *pRight; // for AVL sorting - sal_Bool bModifyLocked : 1; // used in SwModify::Modify, - // is really a member of SwModify - // but here for lack of space + SwClient *pLeft, *pRight; // double-linked list of other clients + SwModify *pRegisteredIn; // event source - sal_Bool bInModify : 1; // is in a modify. (Debug!!!) - sal_Bool bInDocDTOR : 1; // Doc gets destroyed, - // do not "unsubscribe" - sal_Bool bInCache : 1; // is in BorderAttrCache of the layout, - // unsubscribes itself then in Modify! - sal_Bool bInSwFntCache : 1; // is in SwFont cache of the formatting + // in general clients should not be removed when their SwModify sends out Modify() + // notifications; in some rare cases this is necessary, but only the concrete SwClient + // sub class will know that; this flag allows to make that known + bool mbIsAllowedToBeRemovedInModifyCall; -protected: - SwModify *pRegisteredIn; + // callbacks received from SwModify (friend class - so these methods can be private) + // should be called only from SwModify the client is registered in + // mba: IMHO these methods should be pure virtual + virtual void Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew); + virtual void SwClientNotify( const SwModify& rModify, const SfxHint& rHint ); +protected: // single argument ctors shall be explicit. explicit SwClient(SwModify *pToRegisterIn); + // write access to pRegisteredIn shall be granted only to the object itself (protected access) + SwModify* GetRegisteredInNonConst() const { return pRegisteredIn; } + void SetIsAllowedToBeRemovedInModifyCall( bool bSet ) { mbIsAllowedToBeRemovedInModifyCall = bSet; } + public: + inline SwClient(); virtual ~SwClient(); - virtual void Modify( SfxPoolItem *pOld, SfxPoolItem *pNew); + // in case an SwModify object is destroyed that itself is registered in another SwModify, + // its SwClient objects can decide to get registered to the latter instead by calling this method + void CheckRegistration( const SfxPoolItem *pOldValue, const SfxPoolItem *pNewValue ); + + // controlled access to Modify method + // mba: this is still considered a hack and it should be fixed; the name makes grep-ing easier + void ModifyNotification( const SfxPoolItem *pOldValue, const SfxPoolItem *pNewValue ) { Modify ( pOldValue, pNewValue ); } + void SwClientNotifyCall( const SwModify& rModify, const SfxHint& rHint ) { SwClientNotify( rModify, rHint ); } + const SwModify* GetRegisteredIn() const { return pRegisteredIn; } + bool IsLast() const { return !pLeft && !pRight; } - //rtti, derived classes may do likewise or not. When they do, it can be - //casted typesafely via the dependency list of a Modify + // needed for class SwClientIter TYPEINFO(); - void LockModify() { bModifyLocked = sal_True; } - void UnlockModify() { bModifyLocked = sal_False; } - void SetInCache( sal_Bool bNew ) { bInCache = bNew; } - void SetInSwFntCache( sal_Bool bNew ) { bInSwFntCache = bNew; } - sal_Bool IsModifyLocked() const { return bModifyLocked; } - sal_Bool IsInDocDTOR() const { return bInDocDTOR; } - sal_Bool IsInCache() const { return bInCache; } - sal_Bool IsInSwFntCache() const { return bInSwFntCache; } - - // get client Information + // get information about attribute virtual sal_Bool GetInfo( SfxPoolItem& ) const; - -private: - SwClient( const SwClient& ); - SwClient &operator=( const SwClient& ); }; inline SwClient::SwClient() : - pLeft(0), pRight(0), pRegisteredIn(0) -{ bModifyLocked = bInModify = bInDocDTOR = bInCache = bInSwFntCache = sal_False; } - + pLeft(0), pRight(0), pRegisteredIn(0), mbIsAllowedToBeRemovedInModifyCall(false) +{} // ---------- // SwModify // ---------- // class has a doubly linked list for dependencies - class SW_DLLPUBLIC SwModify: public SwClient { - friend SvStream& operator<<( SvStream& aS, SwModify & ); + SwClient* pRoot; // the start of the linked list of clients + sal_Bool bModifyLocked : 1; // don't broadcast changes now + sal_Bool bLockClientList : 1; // may be set when this instance notifies its clients + sal_Bool bInDocDTOR : 1; // workaround for problems when a lot of objects are destroyed + sal_Bool bInCache : 1; + sal_Bool bInSwFntCache : 1; - friend class SwClientIter; - SwClient* pRoot; - - SwClient *_Remove(SwClient *pDepend); + // mba: IMHO this method should be pure virtual + virtual void Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew); public: - SwModify() : pRoot(0) {} + SwModify(); + + // broadcasting: send notifications to all clients + void NotifyClients( const SfxPoolItem *pOldValue, const SfxPoolItem *pNewValue ); + + // the same, but without setting bModifyLocked or checking for any of the flags + // mba: it would be interesting to know why this is necessary + // also allows to limit callback to certain type (HACK) + void ModifyBroadcast( const SfxPoolItem *pOldValue, const SfxPoolItem *pNewValue, TypeId nType = TYPE(SwClient) ); + + // a more universal broadcasting mechanism + void CallSwClientNotify( const SfxHint& rHint ) const; // single argument ctors shall be explicit. - explicit SwModify(SwModify *pToRegisterIn ); + explicit SwModify( SwModify *pToRegisterIn ); virtual ~SwModify(); - virtual void Modify( SfxPoolItem *pOldValue, SfxPoolItem *pNewValue ); void Add(SwClient *pDepend); - SwClient *Remove(SwClient *pDepend) - { return bInDocDTOR ? 0 : _Remove( pDepend ); } - + SwClient* Remove(SwClient *pDepend); const SwClient* GetDepends() const { return pRoot; } - // get client information + // get information about attribute virtual sal_Bool GetInfo( SfxPoolItem& ) const; - void SetInDocDTOR() { bInDocDTOR = sal_True; } + void LockModify() { bModifyLocked = sal_True; } + void UnlockModify() { bModifyLocked = sal_False; } + void SetInCache( sal_Bool bNew ) { bInCache = bNew; } + void SetInSwFntCache( sal_Bool bNew ) { bInSwFntCache = bNew; } + void SetInDocDTOR() { bInDocDTOR = sal_True; } + sal_Bool IsModifyLocked() const { return bModifyLocked; } + sal_Bool IsInDocDTOR() const { return bInDocDTOR; } + sal_Bool IsInCache() const { return bInCache; } + sal_Bool IsInSwFntCache() const { return bInSwFntCache; } void CheckCaching( const sal_uInt16 nWhich ); - - sal_Bool IsLastDepend() const - { return pRoot && !pRoot->pLeft && !pRoot->pRight; } - -private: - // forbidden and not implemented (see @ SwClient). - SwModify & operator= (const SwModify &); - -protected: - // forbidden and not implemented (see @ SwClient), - // but GCC >= 3.4 needs an accessible "T (const T&)" - // to pass a "T" as a "const T&" argument - SwModify (const SwModify &); + bool IsLastDepend() { return pRoot && pRoot->IsLast(); } + int GetClientCount() const; }; // ---------- @@ -167,9 +187,7 @@ protected: // ---------- /* - * Very useful class when an object depends on multiple objects. - * This should have an object of the class SwDepend as member for each - * dependency. + * Helper class for objects that need to depend on more than one SwClient */ class SW_DLLPUBLIC SwDepend: public SwClient { @@ -180,69 +198,66 @@ public: SwDepend(SwClient *pTellHim, SwModify *pDepend); SwClient* GetToTell() { return pToTell; } - virtual void Modify( SfxPoolItem *pOldValue, SfxPoolItem *pNewValue ); // get Client information virtual sal_Bool GetInfo( SfxPoolItem & ) const; -private: - // forbidden and not implemented (see @ SwClient). - SwDepend (const SwDepend &); - SwDepend & operator= (const SwDepend &); +protected: + virtual void Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNewValue ); + virtual void SwClientNotify( const SwModify& rModify, const SfxHint& rHint ); }; class SwClientIter { - friend SwClient* SwModify::_Remove(SwClient *); // for ptr correction - friend void SwModify::Add(SwClient *); // only for OSL_ENSURE ! + friend SwClient* SwModify::Remove(SwClient *); // for pointer adjustments + friend void SwModify::Add(SwClient *pDepend); // for pointer adjustments - SwModify const& rRoot; - SwClient *pAkt, *pDelNext; - // for updating of all iterators when inserting/deleting clients, while the - // iterator points on it - SwClientIter *pNxtIter; + const SwModify& rRoot; + + // the current object in an iteration + SwClient* pAct; + + // in case the current object is already removed, the next object in the list + // is marked down to become the current object in the next step + // this is necessary because iteration requires access to members of the current object + SwClient* pDelNext; - SwClient* mpWatchClient; // if set, SwModify::_Remove checks if this client is removed + // SwClientIter objects are tracked in linked list so that they can react + // when the current (pAct) or marked down (pDelNext) SwClient is removed + // from its SwModify + SwClientIter *pNxtIter; - TypeId aSrchId; // for First/Next - look for this type + // iterator can be limited to return only SwClient objects of a certain type + TypeId aSrchId; public: - SW_DLLPUBLIC SwClientIter( SwModify const& ); + SW_DLLPUBLIC SwClientIter( const SwModify& ); SW_DLLPUBLIC ~SwClientIter(); - const SwModify& GetModify() const { return rRoot; } + const SwModify& GetModify() const { return rRoot; } SwClient* operator++(int); - SwClient* operator--(int); - SwClient* operator++(); - SwClient* operator--(); - SwClient* GoStart(); SwClient* GoEnd(); - inline SwClient* GoRoot(); // restart from root - + // returns the current SwClient object; + // in case this was already removed, the object marked down to become + // the next current one is returned SwClient* operator()() const - { return pDelNext == pAkt ? pAkt : pDelNext; } + { return pDelNext == pAct ? pAct : pDelNext; } - int IsChanged() const { return pDelNext != pAkt; } + // return "true" if an object was removed from a client chain in iteration + // adding objects to a client chain in iteration is forbidden + // SwModify::Add() asserts this + bool IsChanged() const { return pDelNext != pAct; } SW_DLLPUBLIC SwClient* First( TypeId nType ); SW_DLLPUBLIC SwClient* Next(); - - const SwClient* GetWatchClient() const { return mpWatchClient; } - void SetWatchClient( SwClient* pWatch ) { mpWatchClient = pWatch; } + SW_DLLPUBLIC SwClient* Last( TypeId nType ); + SW_DLLPUBLIC SwClient* Previous(); }; -inline SwClient* SwClientIter::GoRoot() -{ - pAkt = rRoot.pRoot; - return (pDelNext = pAkt); -} - - - #endif /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/inc/crsrsh.hxx b/sw/inc/crsrsh.hxx index 2a91682b5dc4..b24d29742db2 100644 --- a/sw/inc/crsrsh.hxx +++ b/sw/inc/crsrsh.hxx @@ -308,6 +308,9 @@ protected: */ SW_DLLPRIVATE void UpdateMarkedListLevel(); +protected: + virtual void Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew); + public: TYPEINFO(); SwCrsrShell( SwDoc& rDoc, Window *pWin, const SwViewOption *pOpt = 0 ); @@ -315,8 +318,6 @@ public: SwCrsrShell( SwCrsrShell& rShell, Window *pWin ); virtual ~SwCrsrShell(); - virtual void Modify( SfxPoolItem *pOld, SfxPoolItem *pNew); - // create new cursor and append the old one virtual SwPaM & CreateNewShellCursor(); virtual SwPaM & GetCurrentShellCursor(); diff --git a/sw/inc/dcontact.hxx b/sw/inc/dcontact.hxx index 07044bce0182..54df6bf10243 100644 --- a/sw/inc/dcontact.hxx +++ b/sw/inc/dcontact.hxx @@ -36,6 +36,7 @@ #include <list> #include "calbck.hxx" +#include <anchoreddrawobject.hxx> class SfxPoolItem; class SwFrmFmt; @@ -47,11 +48,10 @@ class SwVirtFlyDrawObj; class SwFmtAnchor; class SwFlyDrawObj; class SwRect; -// forward declaration for class <SwDrawVirtObj> class SwDrawContact; struct SwPosition; class SwIndex; -#include <anchoreddrawobject.hxx> +class SdrTextObj; // The other way round: Search format for given object. // If object is a SwVirtFlyDrawObj the format will be obtained from it. @@ -189,7 +189,7 @@ public: /** get data collection of anchored objects, handled by with contact */ - virtual void GetAnchoredObjs( std::vector<SwAnchoredObject*>& _roAnchoredObjs ) const = 0; + virtual void GetAnchoredObjs( std::list<SwAnchoredObject*>& _roAnchoredObjs ) const = 0; /** get minimum order number of anchored objects handled by with contact @@ -210,13 +210,9 @@ class SW_DLLPUBLIC SwFlyDrawContact : public SwContact private: SwFlyDrawObj* mpMasterObj; - /** method to determine new order number for new instance of <SwVirtFlyDrawObj> - - Used in method <CreateNewRef(..)>. - - @author OD - */ - sal_uInt32 _GetOrdNumForNewRef( const SwFlyFrm* pFlyFrm ); +protected: + // virtuelle Methoden von SwClient + virtual void Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew ); public: TYPEINFO(); @@ -232,11 +228,6 @@ public: virtual SdrObject* GetMaster(); virtual void SetMaster( SdrObject* _pNewMaster ); - SwVirtFlyDrawObj* CreateNewRef( SwFlyFrm* pFly ); - - // virtual methods from SwClient - virtual void Modify( SfxPoolItem *pOld, SfxPoolItem *pNew ); - // override methods to control Writer fly frames, // which are linked, and to assure that all objects anchored at/inside the // Writer fly frame are also made visible/invisible. @@ -245,7 +236,7 @@ public: /** get data collection of anchored objects handled by with contact */ - virtual void GetAnchoredObjs( std::vector<SwAnchoredObject*>& _roAnchoredObjs ) const; + virtual void GetAnchoredObjs( std::list<SwAnchoredObject*>& _roAnchoredObjs ) const; }; // new class for re-direct methods calls at a 'virtual' @@ -416,6 +407,11 @@ class SwDrawContact : public SwContact // no copy-constructor and no assignment operator SwDrawContact( const SwDrawContact& ); SwDrawContact& operator=( const SwDrawContact& ); + + protected: + // virtuelle Methoden von SwClient + virtual void Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew ); + public: TYPEINFO(); @@ -471,9 +467,6 @@ class SwDrawContact : public SwContact // by frame. SdrObject* GetDrawObjectByAnchorFrm( const SwFrm& _rAnchorFrm ); - // Virtual methods of SwClient. - virtual void Modify( SfxPoolItem *pOld, SfxPoolItem *pNew ); - // Virtual methods of SdrObjUserCall. virtual void Changed(const SdrObject& rObj, SdrUserCallType eType, const Rectangle& rOldBoundRect); @@ -490,7 +483,9 @@ class SwDrawContact : public SwContact /** get data collection of anchored objects, handled by with contact */ - virtual void GetAnchoredObjs( std::vector<SwAnchoredObject*>& _roAnchoredObjs ) const; + + static void GetTextObjectsFromFmt( std::list<SdrTextObj*>&, SwDoc* ); + virtual void GetAnchoredObjs( std::list<SwAnchoredObject*>& _roAnchoredObjs ) const; }; #endif diff --git a/sw/inc/doc.hxx b/sw/inc/doc.hxx index 44480a7012b7..1a4e7df2df65 100644 --- a/sw/inc/doc.hxx +++ b/sw/inc/doc.hxx @@ -321,7 +321,7 @@ class SW_DLLPUBLIC SwDoc : SwTOXTypes *pTOXTypes; // Tables/indices SwDefTOXBase_Impl * pDefTOXBases; // defaults of SwTOXBase's - SwRootFrm *pLayout; // Rootframe of the specific layout. + ViewShell *pCurrentView; // SwDoc should get a new member pCurrentView//swmod 071225 SdrModel *pDrawModel; // StarView Drawing SwDocUpdtFld *pUpdtFlds; // Struct for updating fields @@ -447,7 +447,6 @@ private: bool mbNewFldLst : 1; // TRUE: Rebuild field-list. bool mbCopyIsMove : 1; // TRUE: Copy is a hidden Move. bool mbVisibleLinks : 1; // TRUE: Links are inserted visibly. - bool mbBrowseMode : 1; // TRUE: Show document in browser mode. bool mbInReading : 1; // TRUE: Document is in the process of being read. bool mbInXMLImport : 1; // TRUE: During xml import, attribute portion building is not necessary. bool mbUpdateTOX : 1; // TRUE: After loading document, update TOX. @@ -581,6 +580,8 @@ private: bool mbCollapseEmptyCellPara : 1; bool mbTabAtLeftIndentForParagraphsInList; // #i89181# - see above + bool mbLastBrowseMode : 1; + sal_uInt32 n32DummyCompatabilityOptions1; sal_uInt32 n32DummyCompatabilityOptions2; // @@ -935,15 +936,18 @@ public: /** IDocumentLayoutAccess */ - virtual const SwRootFrm* GetRootFrm() const ; - virtual SwRootFrm* GetRootFrm(); - virtual void SetRootFrm( SwRootFrm* pNew ); + virtual void SetCurrentViewShell( ViewShell* pNew );//swmod 071225 virtual SwLayouter* GetLayouter(); virtual const SwLayouter* GetLayouter() const; virtual void SetLayouter( SwLayouter* pNew ); virtual SwFrmFmt* MakeLayoutFmt( RndStdIds eRequest, const SfxItemSet* pSet ); virtual void DelLayoutFmt( SwFrmFmt *pFmt ); virtual SwFrmFmt* CopyLayoutFmt( const SwFrmFmt& rSrc, const SwFmtAnchor& rNewAnchor, bool bSetTxtFlyAtt, bool bMakeFrms ); + virtual const ViewShell *GetCurrentViewShell() const; //swmod 080219 + virtual ViewShell *GetCurrentViewShell();//swmod 080219 It must be able to communicate to a ViewShell.This is going to be removerd later. + virtual const SwRootFrm *GetCurrentLayout() const; + virtual SwRootFrm *GetCurrentLayout();//swmod 080219 + virtual bool HasLayout() const; /** IDocumentTimerAccess */ @@ -1130,6 +1134,8 @@ public: String GetUniqueOLEName() const; String GetUniqueFrameName() const; + std::set<SwRootFrm*> GetAllLayouts();//swmod 080225 + void SetFlyName( SwFlyFrmFmt& rFmt, const String& rName ); const SwFlyFrmFmt* FindFlyByName( const String& rName, sal_Int8 nNdTyp = 0 ) const; @@ -1288,16 +1294,13 @@ public: // get the set of printable pages for the XRenderable API by // evaluating the respective settings (see implementation) - void CalculatePagesForPrinting( SwRenderData &rData, const SwPrintUIOptions &rOptions, bool bIsPDFExport, + void CalculatePagesForPrinting( const SwRootFrm& rLayout, SwRenderData &rData, const SwPrintUIOptions &rOptions, bool bIsPDFExport, sal_Int32 nDocPageCount ); void UpdatePagesForPrintingWithPostItData( SwRenderData &rData, const SwPrintUIOptions &rOptions, bool bIsPDFExport, sal_Int32 nDocPageCount ); - void CalculatePagePairsForProspectPrinting( SwRenderData &rData, const SwPrintUIOptions &rOptions, + void CalculatePagePairsForProspectPrinting( const SwRootFrm& rLayout, SwRenderData &rData, const SwPrintUIOptions &rOptions, sal_Int32 nDocPageCount ); - sal_uInt16 GetPageCount() const; - const Size GetPageSize( sal_uInt16 nPageNum, bool bSkipEmptyPages ) const; - // PageDescriptor interface. sal_uInt16 GetPageDescCnt() const { return aPageDescs.Count(); } const SwPageDesc& GetPageDesc( const sal_uInt16 i ) const { return *aPageDescs[i]; } @@ -1842,7 +1845,7 @@ public: // update all modified OLE-Objects. The modification is called over the // StarOne - Interface void SetOLEObjModified() - { if( GetRootFrm() ) aOLEModifiedTimer.Start(); } + { if( GetCurrentViewShell() ) aOLEModifiedTimer.Start(); } //swmod 071107//swmod 071225 // -------------------- Uno - Interfaces --------------------------- const SwUnoCrsrTbl& GetUnoCrsrTbl() const { return *pUnoCrsrTbl; } diff --git a/sw/inc/docsh.hxx b/sw/inc/docsh.hxx index a20d9d54f7a4..4f644afc40b0 100644 --- a/sw/inc/docsh.hxx +++ b/sw/inc/docsh.hxx @@ -278,7 +278,7 @@ public: void EnterWait( sal_Bool bLockDispatcher ); void LeaveWait( sal_Bool bLockDispatcher ); - void ToggleBrowserMode(sal_Bool bOn, SwView* pView = 0); + void ToggleBrowserMode(sal_Bool bOn, SwView* pView); sal_uLong LoadStylesFromFile( const String& rURL, SwgReaderOption& rOpt, sal_Bool bUnoCall ); diff --git a/sw/inc/docufld.hxx b/sw/inc/docufld.hxx index 177229930bdb..d4dcbd06d2c7 100644 --- a/sw/inc/docufld.hxx +++ b/sw/inc/docufld.hxx @@ -639,8 +639,10 @@ public: SwRefPageSetFieldType(); virtual SwFieldType* Copy() const; - // Overlay, because there is nothing to update! - virtual void Modify( SfxPoolItem *, SfxPoolItem * ); + +protected: + // Overlay, because there is nothing to update! + virtual void Modify( const SfxPoolItem*, const SfxPoolItem * ); }; /*-------------------------------------------------------------------- @@ -680,15 +682,13 @@ class SwRefPageGetFieldType : public SwFieldType sal_Int16 nNumberingType; void UpdateField( SwTxtFld* pTxtFld, _SetGetExpFlds& rSetList ); - +protected: + // ueberlagert, um alle RefPageGet-Felder zu updaten + virtual void Modify( const SfxPoolItem*, const SfxPoolItem * ); public: SwRefPageGetFieldType( SwDoc* pDoc ); virtual SwFieldType* Copy() const; - - // Overlay in order to update all RefPageGet-fields. - virtual void Modify( SfxPoolItem *, SfxPoolItem * ); sal_uInt16 MakeSetList( _SetGetExpFlds& rTmpLst ); - SwDoc* GetDoc() const { return pDoc; } }; diff --git a/sw/inc/editsh.hxx b/sw/inc/editsh.hxx index b9c747b22ffd..0d09cda564b0 100644 --- a/sw/inc/editsh.hxx +++ b/sw/inc/editsh.hxx @@ -552,7 +552,7 @@ public: sal_Bool HasOtherCnt() const; // Apply ViewOptions with Start-/EndAction. - inline void ApplyViewOptions( const SwViewOption &rOpt ); + virtual void ApplyViewOptions( const SwViewOption &rOpt ); // Query text within selection. // Returns FALSE, if selected range is too large to be copied @@ -918,13 +918,6 @@ private: const SwEditShell &operator=(const SwEditShell &); }; -inline void SwEditShell::ApplyViewOptions( const SwViewOption &rOpt ) -{ - SwCrsrShell::StartAction(); - ViewShell::ApplyViewOptions( rOpt ); - SwEditShell::EndAction(); -} - inline const sfx2::LinkManager& SwEditShell::GetLinkManager() const { return ((SwEditShell*)this)->GetLinkManager(); } diff --git a/sw/inc/expfld.hxx b/sw/inc/expfld.hxx index e80b2c264578..a565244b89ba 100644 --- a/sw/inc/expfld.hxx +++ b/sw/inc/expfld.hxx @@ -77,8 +77,8 @@ public: // Overlay, because get-field cannot be changed and therefore // does not need to be updated. Update at changing of set-values! - - virtual void Modify( SfxPoolItem *pOld, SfxPoolItem *pNew ); +protected: + virtual void Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew ); }; class SW_DLLPUBLIC SwGetExpField : public SwFormulaField @@ -153,6 +153,9 @@ class SW_DLLPUBLIC SwSetExpFieldType : public SwValueFieldType sal_uInt8 nLevel; sal_Bool bDeleted; +protected: + virtual void Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew ); + public: SwSetExpFieldType( SwDoc* pDoc, const String& rName, sal_uInt16 nType = nsSwGetSetExpType::GSE_EXPR ); @@ -169,7 +172,6 @@ public: void SetDeleted( sal_Bool b ) { bDeleted = b; } // Overlay, because set-field takes care for its being updated by itself. - virtual void Modify( SfxPoolItem *pOld, SfxPoolItem *pNew ); inline const String& GetSetRefName() const; sal_uInt16 SetSeqRefNo( SwSetExpField& rFld ); diff --git a/sw/inc/fchrfmt.hxx b/sw/inc/fchrfmt.hxx index 48c7590dec11..a6951cde3372 100644 --- a/sw/inc/fchrfmt.hxx +++ b/sw/inc/fchrfmt.hxx @@ -54,6 +54,9 @@ public: // @@@ public copy ctor, but no copy assignment? SwFmtCharFmt( const SwFmtCharFmt& rAttr ); +protected: + virtual void Modify( const SfxPoolItem*, const SfxPoolItem* ); + private: // @@@ public copy ctor, but no copy assignment? SwFmtCharFmt & operator= (const SwFmtCharFmt &); @@ -73,8 +76,6 @@ public: virtual bool QueryValue( com::sun::star::uno::Any& rVal, sal_uInt8 nMemberId = 0 ) const; virtual bool PutValue( const com::sun::star::uno::Any& rVal, sal_uInt8 nMemberId = 0 ); - // Pass to SwTxtCharFmt (from SwClient). - virtual void Modify( SfxPoolItem*, SfxPoolItem* ); virtual sal_Bool GetInfo( SfxPoolItem& rInfo ) const; void SetCharFmt( SwFmt* pFmt ) { pFmt->Add(this); } diff --git a/sw/inc/fldbas.hxx b/sw/inc/fldbas.hxx index 8c6c925d5bdf..0d2c13f0160a 100644 --- a/sw/inc/fldbas.hxx +++ b/sw/inc/fldbas.hxx @@ -272,7 +272,7 @@ public: inline void SwFieldType::UpdateFlds() const { - ((SwFieldType*)this)->Modify( 0, 0 ); + ((SwFieldType*)this)->ModifyNotification( 0, 0 ); } // Base class of all fields. diff --git a/sw/inc/fmtcol.hxx b/sw/inc/fmtcol.hxx index 4f941e084132..95b4af9faf41 100644 --- a/sw/inc/fmtcol.hxx +++ b/sw/inc/fmtcol.hxx @@ -91,10 +91,11 @@ protected: mbAssignedToOutlineStyle(false) { pNextTxtFmtColl = this; } -public: // To get UL- / LR- / FontHeight-changes. - virtual void Modify( SfxPoolItem*, SfxPoolItem* ); + virtual void Modify( const SfxPoolItem*, const SfxPoolItem* ); + +public: TYPEINFO(); // Already in base class Client. @@ -232,6 +233,7 @@ public: void SetCondition( sal_uLong nCond, sal_uLong nSubCond ); SwTxtFmtColl* GetTxtFmtColl() const { return (SwTxtFmtColl*)GetRegisteredIn(); } + void RegisterToFormat( SwFmt& ); }; typedef SwCollCondition* SwCollConditionPtr; diff --git a/sw/inc/fmtfld.hxx b/sw/inc/fmtfld.hxx index c6edb55fe82f..3641f3f6f534 100644 --- a/sw/inc/fmtfld.hxx +++ b/sw/inc/fmtfld.hxx @@ -28,6 +28,7 @@ #ifndef _FMTFLD_HXX #define _FMTFLD_HXX +#include <list> #include <svl/poolitem.hxx> #include <svl/brdcst.hxx> #include <svl/smplhint.hxx> @@ -38,6 +39,7 @@ class SwField; class SwTxtFld; class SwView; +class SwFieldType; // ATT_FLD class SW_DLLPUBLIC SwFmtFld : public SfxPoolItem, public SwClient, public SfxBroadcaster @@ -54,6 +56,10 @@ class SW_DLLPUBLIC SwFmtFld : public SfxPoolItem, public SwClient, public SfxBro // @@@ copy construction allowed, but copy assignment is not? @@@ SwFmtFld& operator=(const SwFmtFld& rFld); +protected: + virtual void Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew); + virtual void SwClientNotify( const SwModify& rModify, const SfxHint& rHint ); + public: TYPEINFO(); @@ -69,7 +75,6 @@ public: virtual int operator==( const SfxPoolItem& ) const; virtual SfxPoolItem* Clone( SfxItemPool* pPool = 0 ) const; - virtual void Modify( SfxPoolItem* pOld, SfxPoolItem* pNew ); virtual sal_Bool GetInfo( SfxPoolItem& rInfo ) const; const SwField *GetFld() const { return pField; } @@ -87,6 +92,7 @@ public: const SwTxtFld *GetTxtFld() const { return pTxtAttr; } SwTxtFld *GetTxtFld() { return pTxtAttr; } + void RegisterToFieldType( SwFieldType& ); sal_Bool IsFldInDoc() const; sal_Bool IsProtect() const; }; diff --git a/sw/inc/fmthdft.hxx b/sw/inc/fmthdft.hxx index 67134aabd75d..1abca0c96cb1 100644 --- a/sw/inc/fmthdft.hxx +++ b/sw/inc/fmthdft.hxx @@ -35,7 +35,7 @@ class SwFrmFmt; class IntlWrapper; - +class SwFmt; //Header, for PageFormats //Client of FrmFmt discribing the header. @@ -62,9 +62,10 @@ public: String &rText, const IntlWrapper* pIntl = 0 ) const; - const SwFrmFmt *GetHeaderFmt() const { return (SwFrmFmt*)pRegisteredIn; } - SwFrmFmt *GetHeaderFmt() { return (SwFrmFmt*)pRegisteredIn; } + const SwFrmFmt *GetHeaderFmt() const { return (SwFrmFmt*)GetRegisteredIn(); } + SwFrmFmt *GetHeaderFmt() { return (SwFrmFmt*)GetRegisteredIn(); } + void RegisterToFormat( SwFmt& rFmt ); sal_Bool IsActive() const { return bActive; } void SetActive( sal_Bool bNew = sal_True ) { bActive = bNew; } }; @@ -94,9 +95,10 @@ public: String &rText, const IntlWrapper* pIntl = 0 ) const; - const SwFrmFmt *GetFooterFmt() const { return (SwFrmFmt*)pRegisteredIn; } - SwFrmFmt *GetFooterFmt() { return (SwFrmFmt*)pRegisteredIn; } + const SwFrmFmt *GetFooterFmt() const { return (SwFrmFmt*)GetRegisteredIn(); } + SwFrmFmt *GetFooterFmt() { return (SwFrmFmt*)GetRegisteredIn(); } + void RegisterToFormat( SwFmt& rFmt ); sal_Bool IsActive() const { return bActive; } void SetActive( sal_Bool bNew = sal_True ) { bActive = bNew; } }; diff --git a/sw/inc/fmtmeta.hxx b/sw/inc/fmtmeta.hxx index 459220c6007f..87f096d2d806 100644 --- a/sw/inc/fmtmeta.hxx +++ b/sw/inc/fmtmeta.hxx @@ -75,17 +75,13 @@ namespace com { namespace sun { namespace star { * <li>The pool item is cloned (because it is non-poolable); the clone * points to the same metadatable entity, but the metadatable entity's * reverse pointer is unchanged.</li> - * <li>A new text hint is created, taking over the new pool item. - * Unfortunately, this also makes the metadatable entity point at the - * cloned pool item.</li> - * <li>The text hint is inserted into the hints array of some text node.</li> - * <li>The DoCopy() method must be called at the new pool item: - * it will clone the metadatable entity (using RegisterAsCopyOf), - * and fix the reverse pointer of the original to point at the - * original pool item. + * <li>The DoCopy() method is called at the new pool item: + * it will clone the metadatable entity (using RegisterAsCopyOf). * This is necessary, because first, a metadatable entity may * only be inserted once into a document, and second, the copy may be * inserted into a different document than the source document!</li> + * <li>A new text hint is created, taking over the new pool item.</li> + * <li>The text hint is inserted into the hints array of some text node.</li> * </ol> */ @@ -100,7 +96,7 @@ class SwFmtMeta : public SfxPoolItem { private: - friend class SwTxtMeta; // needs SetTxtAttr + friend class SwTxtMeta; // needs SetTxtAttr, DoCopy friend class ::sw::Meta; // needs m_pTxtAttr ::boost::shared_ptr< ::sw::Meta > m_pMeta; @@ -109,6 +105,10 @@ private: SwTxtMeta * GetTxtAttr() { return m_pTxtAttr; } void SetTxtAttr(SwTxtMeta * const i_pTxtAttr); + /// this method <em>must</em> be called when the hint is actually copied + void DoCopy(::sw::MetaFieldManager & i_rTargetDocManager, + SwTxtNode & i_rTargetTxtNode); + explicit SwFmtMeta( const sal_uInt16 i_nWhich ); public: @@ -125,8 +125,6 @@ public: void NotifyChangeTxtNode(SwTxtNode *const pTxtNode); static SwFmtMeta * CreatePoolDefault( const sal_uInt16 i_nWhich ); ::sw::Meta * GetMeta() { return m_pMeta.get(); } - /// this method <em>must</em> be called when the hint is actually copied - void DoCopy( SwFmtMeta & rOriginalMeta ); }; @@ -146,6 +144,7 @@ protected: ::com::sun::star::rdf::XMetadatable> m_wXMeta; SwFmtMeta * m_pFmt; + SwTxtNode * m_pTxtNode; SwTxtMeta * GetTxtAttr() const; SwTxtNode * GetTxtNode() const; // returns 0 if not in document (undo) @@ -153,7 +152,8 @@ protected: SwFmtMeta * GetFmtMeta() const { return m_pFmt; } void SetFmtMeta( SwFmtMeta * const i_pFmt ) { m_pFmt = i_pFmt; }; - void NotifyChangeTxtNode(); + void NotifyChangeTxtNodeImpl(); + void NotifyChangeTxtNode(SwTxtNode *const pTxtNode); ::com::sun::star::uno::WeakReference< ::com::sun::star::rdf::XMetadatable> const& GetXMeta() const @@ -162,13 +162,13 @@ protected: ::com::sun::star::rdf::XMetadatable> const& xMeta) { m_wXMeta = xMeta; } + // SwClient + virtual void Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew ); + public: explicit Meta(SwFmtMeta * const i_pFmt = 0); virtual ~Meta(); - // SwClient - virtual void Modify( SfxPoolItem *pOld, SfxPoolItem *pNew ); - // sfx2::Metadatable virtual ::sfx2::IXmlIdRegistry& GetRegistry(); virtual bool IsInClipboard() const; diff --git a/sw/inc/fmtpdsc.hxx b/sw/inc/fmtpdsc.hxx index 307fcb6576ab..64f93d260724 100644 --- a/sw/inc/fmtpdsc.hxx +++ b/sw/inc/fmtpdsc.hxx @@ -39,6 +39,7 @@ class SwPageDesc; class SwHistory; class SwPaM; class IntlWrapper; +class SwEndNoteInfo; // Pagedescriptor // Client of SwPageDesc that is "described" by the attribute. @@ -56,6 +57,9 @@ class SW_DLLPUBLIC SwFmtPageDesc : public SfxPoolItem, public SwClient sal_uInt16 nDescNameIdx; // SW3-Reader: stringpool-index of style name. SwModify* pDefinedIn; // Points to the object in which the // attribute was set (CntntNode/Format). +protected: + virtual void Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew ); + virtual void SwClientNotify( const SwModify&, const SfxHint& rHint ); public: SwFmtPageDesc( const SwPageDesc *pDesc = 0 ); @@ -76,8 +80,6 @@ public: virtual bool QueryValue( com::sun::star::uno::Any& rVal, sal_uInt8 nMemberId = 0 ) const; virtual bool PutValue( const com::sun::star::uno::Any& rVal, sal_uInt8 nMemberId = 0 ); - virtual void Modify( SfxPoolItem *pOld, SfxPoolItem *pNew ); - SwPageDesc *GetPageDesc() { return (SwPageDesc*)GetRegisteredIn(); } const SwPageDesc *GetPageDesc() const { return (SwPageDesc*)GetRegisteredIn(); } @@ -87,6 +89,9 @@ public: // Query / set where attribute is anchored. inline const SwModify* GetDefinedIn() const { return pDefinedIn; } void ChgDefinedIn( const SwModify* pNew ) { pDefinedIn = (SwModify*)pNew; } + void RegisterToEndNotInfo( SwEndNoteInfo& ); + void RegisterToPageDesc( SwPageDesc& ); + bool KnowsPageDesc() const; }; diff --git a/sw/inc/format.hxx b/sw/inc/format.hxx index 6f7e9b84f428..660a7fe653e8 100644 --- a/sw/inc/format.hxx +++ b/sw/inc/format.hxx @@ -44,7 +44,6 @@ class SwDoc; class SW_DLLPUBLIC SwFmt : public SwModify { - String aFmtName; SwAttrSet aSet; @@ -68,6 +67,7 @@ protected: SwFmt( SwAttrPool& rPool, const String &rFmtNm, const sal_uInt16* pWhichRanges, SwFmt *pDrvdFrm, sal_uInt16 nFmtWhich ); SwFmt( const SwFmt& rFmt ); + virtual void Modify( const SfxPoolItem* pOld, const SfxPoolItem* pNewValue ); public: TYPEINFO(); // Already in base class Client. @@ -78,7 +78,6 @@ public: // for Querying of Writer-functions. sal_uInt16 Which() const { return nWhichId; } - virtual void Modify( SfxPoolItem* pOldValue, SfxPoolItem* pNewValue ); // Query format information. virtual sal_Bool GetInfo( SfxPoolItem& ) const; @@ -106,7 +105,7 @@ public: // returns count of deleted hints. virtual sal_uInt16 ResetAllFmtAttr(); - inline SwFmt* DerivedFrom() const { return (SwFmt*)pRegisteredIn; } + inline SwFmt* DerivedFrom() const { return (SwFmt*)GetRegisteredIn(); } inline sal_Bool IsDefault() const { return DerivedFrom() == 0; } inline const String& GetName() const { return aFmtName; } diff --git a/sw/inc/frmfmt.hxx b/sw/inc/frmfmt.hxx index 229d482b34e1..e06dea97ab54 100644 --- a/sw/inc/frmfmt.hxx +++ b/sw/inc/frmfmt.hxx @@ -29,12 +29,9 @@ #define _FRMFMT_HXX #include <com/sun/star/text/PositionLayoutDir.hpp> - #include <cppuhelper/weakref.hxx> #include <tools/gen.hxx> - #include <format.hxx> - #include "swdllapi.h" class SwFlyFrm; @@ -70,6 +67,8 @@ protected: pDrvdFrm, nFmtWhich ) {} + virtual void Modify( const SfxPoolItem* pOld, const SfxPoolItem* pNewValue ); + public: TYPEINFO(); // Already in base class Client. @@ -81,8 +80,6 @@ public: virtual Graphic MakeGraphic( ImageMap* pMap = NULL ); - virtual void Modify( SfxPoolItem* pOldValue, SfxPoolItem* pNewValue ); - // Returns the IMapObject defined at format (Fly) // in the ImageMap at position Point. // rPoint - test on DocPosition. @@ -142,6 +139,7 @@ public: { m_wXObject = xObject; } DECL_FIXEDMEMPOOL_NEWDEL_DLL(SwFrmFmt) + void RegisterToFormat( SwFmt& rFmt ); }; // The FlyFrame-Format diff --git a/sw/inc/ftninfo.hxx b/sw/inc/ftninfo.hxx index adfeda9975d2..95b626cc600a 100644 --- a/sw/inc/ftninfo.hxx +++ b/sw/inc/ftninfo.hxx @@ -46,13 +46,16 @@ class SW_DLLPUBLIC SwEndNoteInfo : public SwClient String sSuffix; protected: bool m_bEndNote; + virtual void Modify( const SfxPoolItem* pOld, const SfxPoolItem* pNew ); + public: SvxNumberType aFmt; sal_uInt16 nFtnOffset; void ChgPageDesc( SwPageDesc *pDesc ); - SwPageDesc *GetPageDesc( SwDoc &rDoc ) const; - SwClient *GetPageDescDep() const { return (SwClient*)&aPageDescDep; } + SwPageDesc* GetPageDesc( SwDoc &rDoc ) const; + bool KnowsPageDesc() const; + bool DependsOn( const SwPageDesc* ) const; void SetFtnTxtColl(SwTxtFmtColl& rColl); SwTxtFmtColl* GetFtnTxtColl() const { return (SwTxtFmtColl*) GetRegisteredIn(); } // can be 0. @@ -65,8 +68,6 @@ public: void SetAnchorCharFmt( SwCharFmt* ); SwClient *GetAnchorCharFmtDep() const { return (SwClient*)&aAnchorCharFmtDep; } - virtual void Modify( SfxPoolItem* pOld, SfxPoolItem* pNew ); - SwEndNoteInfo & operator=(const SwEndNoteInfo&); sal_Bool operator==( const SwEndNoteInfo &rInf ) const; @@ -78,6 +79,7 @@ public: void SetPrefix(const String& rSet) { sPrefix = rSet; } void SetSuffix(const String& rSet) { sSuffix = rSet; } + void ReleaseCollection() { if ( GetRegisteredInNonConst() ) GetRegisteredInNonConst()->Remove( this ); } }; enum SwFtnPos diff --git a/sw/inc/lineinfo.hxx b/sw/inc/lineinfo.hxx index 17f78e950ce5..66e3cbf23cff 100644 --- a/sw/inc/lineinfo.hxx +++ b/sw/inc/lineinfo.hxx @@ -58,6 +58,8 @@ class SW_DLLPUBLIC SwLineNumberInfo : public SwClient //purpose of derivation fr sal_Bool bCountInFlys; //Count also within FlyFrames? sal_Bool bRestartEachPage; //Restart counting at the first paragraph of each page //(even on follows when paragraphs are splitted) +protected: + virtual void Modify( const SfxPoolItem*, const SfxPoolItem* ); public: SwLineNumberInfo(); @@ -98,7 +100,7 @@ public: sal_Bool IsRestartEachPage() const { return bRestartEachPage; } void SetRestartEachPage( sal_Bool b ) { bRestartEachPage = b; } - virtual void Modify( SfxPoolItem*, SfxPoolItem* ); + bool HasCharFormat() const { return GetRegisteredIn() != 0; } }; diff --git a/sw/inc/ndhints.hxx b/sw/inc/ndhints.hxx index 58aa4c2d3037..7a345792f5c5 100644 --- a/sw/inc/ndhints.hxx +++ b/sw/inc/ndhints.hxx @@ -43,9 +43,16 @@ class SfxPoolItem; class SfxItemSet; class SwDoc; +typedef enum { + COPY = true, + NEW = false, +} CopyOrNew_t; + +// if COPY then pTxtNode must be given! SW_DLLPRIVATE SwTxtAttr * MakeTxtAttr( SwDoc & rDoc, SfxPoolItem & rNew, - xub_StrLen nStt, xub_StrLen nEnd ); + xub_StrLen const nStt, xub_StrLen const nEnd, + CopyOrNew_t const bIsCopy = NEW, SwTxtNode *const pTxtNode = 0); SW_DLLPRIVATE SwTxtAttr * MakeTxtAttr( SwDoc & rDoc, const SfxItemSet & rSet, xub_StrLen nStt, xub_StrLen nEnd ); diff --git a/sw/inc/ndnotxt.hxx b/sw/inc/ndnotxt.hxx index 70081fcac7ee..869696e4e1a3 100644 --- a/sw/inc/ndnotxt.hxx +++ b/sw/inc/ndnotxt.hxx @@ -60,7 +60,7 @@ protected: public: ~SwNoTxtNode(); - virtual SwCntntFrm *MakeFrm(); + virtual SwCntntFrm *MakeFrm( SwFrm* ); inline SwGrfFmtColl *GetGrfColl() const { return (SwGrfFmtColl*)GetRegisteredIn(); } diff --git a/sw/inc/ndtxt.hxx b/sw/inc/ndtxt.hxx index 61838cf20a15..ee4b9a012c3a 100644 --- a/sw/inc/ndtxt.hxx +++ b/sw/inc/ndtxt.hxx @@ -44,6 +44,7 @@ #include <vector> #include <set> +class SfxHint; class SwNumRule; class SwNodeNum; class SwList; @@ -211,6 +212,10 @@ public: // // End: Data collected during idle time // +protected: + // fuers Umhaengen der TxtFmtCollections (Outline-Nummerierung!!) + virtual void Modify( const SfxPoolItem*, const SfxPoolItem* ); + virtual void SwClientNotify( const SwModify&, const SfxHint& ); public: using SwCntntNode::GetAttr; @@ -333,7 +338,7 @@ public: const ::com::sun::star::uno::Sequence<sal_Int32>& rOffsets ); // Virtual methods from CntntNode. - virtual SwCntntFrm *MakeFrm(); + virtual SwCntntFrm *MakeFrm( SwFrm* ); virtual SwCntntNode *SplitCntntNode( const SwPosition & ); virtual SwCntntNode *JoinNext(); virtual SwCntntNode *JoinPrev(); @@ -741,9 +746,6 @@ public: TYPEINFO(); // fuer rtti - // For re-arranging TxtFmtCollections (outline-numbering!!). - virtual void Modify( SfxPoolItem*, SfxPoolItem* ); - // override SwIndexReg virtual void Update( SwIndex const & rPos, const xub_StrLen nChangeLen, const bool bNegative = false, const bool bDelete = false ); diff --git a/sw/inc/node.hxx b/sw/inc/node.hxx index f666b70d7536..839b40510e1d 100644 --- a/sw/inc/node.hxx +++ b/sw/inc/node.hxx @@ -65,6 +65,7 @@ class SwTOXBase; class SwSectionNode; class SwStartNode; class SwTabFrm; +class SwRootFrm; class SwTable; class SwTableNode; class SwTableBox; @@ -83,6 +84,7 @@ class IDocumentLinksAdministration; class IDocumentFieldsAccess; class IDocumentContentOperations; class IDocumentListItems; +class SwOLENodes; // -------------------- // class SwNode @@ -386,13 +388,17 @@ protected: // SwAttrSet (handle): sal_uInt16 ClearItemsFromAttrSet( const std::vector<sal_uInt16>& rWhichIds ); + virtual void Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew); + public: TYPEINFO(); //Already contained in base class Client. - virtual void Modify( SfxPoolItem *pOld, SfxPoolItem *pNew); + // MakeFrm will be called for a certain layout + // pSib is another SwFrm of the same layout (e.g. the SwRootFrm itself, a sibling, the parent) + virtual SwCntntFrm *MakeFrm( SwFrm* pSib ) = 0; - virtual SwCntntFrm *MakeFrm() = 0; virtual SwCntntNode *SplitCntntNode(const SwPosition & ) = 0; + virtual SwCntntNode *JoinNext(); virtual SwCntntNode *JoinPrev(); // Is it possible to join two nodes? @@ -406,7 +412,9 @@ public: sal_Bool GoNext(SwIndex *, sal_uInt16 nMode ) const; sal_Bool GoPrevious(SwIndex *, sal_uInt16 nMode ) const; - SwCntntFrm *GetFrm( const Point* pDocPos = 0, + // Replacement for good old GetFrm(..): + SwCntntFrm *getLayoutFrm( const SwRootFrm*, + const Point* pDocPos = 0, const SwPosition *pPos = 0, const sal_Bool bCalcFrm = sal_True ) const; // Returns the real size of the frame or an empty rectangle if @@ -480,11 +488,12 @@ public: inline void SetModifyAtAttr( bool bSetModifyAtAttr ) const { mbSetModifyAtAttr = bSetModifyAtAttr; } inline bool GetModifyAtAttr() const { return mbSetModifyAtAttr; } + static SwOLENodes* CreateOLENodesArray( const SwFmtColl& rColl, bool bOnlyWithInvalidSize ); + private: // Private constructor because copying is never allowed!! SwCntntNode( const SwCntntNode & rNode ); SwCntntNode & operator= ( const SwCntntNode & rNode ); - }; @@ -504,7 +513,7 @@ public: const SwTable& GetTable() const { return *pTable; } SwTable& GetTable() { return *pTable; } - SwTabFrm *MakeFrm(); + SwTabFrm *MakeFrm( SwFrm* ); // Creates the frms for the table node (i.e. the TabFrms). void MakeFrms( SwNodeIndex* pIdxBehind ); @@ -549,7 +558,7 @@ public: const SwSection& GetSection() const { return *m_pSection; } SwSection& GetSection() { return *m_pSection; } - SwFrm *MakeFrm(); + SwFrm *MakeFrm( SwFrm* ); // Creates the frms for the SectionNode (i.e. the SectionFrms). // On default the frames are created until the end of the range. diff --git a/sw/inc/numrule.hxx b/sw/inc/numrule.hxx index beb6b1fe8e5c..35bc16818507 100644 --- a/sw/inc/numrule.hxx +++ b/sw/inc/numrule.hxx @@ -39,12 +39,12 @@ #include <hints.hxx> #include <boost/unordered_map.hpp> #include <stringhash.hxx> -class SwNodeNum; #include <SwNumberTreeTypes.hxx> #include <vector> + class SwTxtFmtColl; class IDocumentListsAccess; - +class SwNodeNum; class Font; class SvxBrushItem; class SvxNumRule; @@ -65,6 +65,9 @@ class SW_DLLPUBLIC SwNumFmt : public SvxNumberFormat, public SwClient using SvxNumberFormat::operator ==; using SvxNumberFormat::operator !=; +protected: + virtual void Modify( const SfxPoolItem* pOld, const SfxPoolItem* pNew ); + public: SwNumFmt(); SwNumFmt( const SwNumFmt& ); @@ -77,9 +80,9 @@ public: sal_Bool operator==( const SwNumFmt& ) const; sal_Bool operator!=( const SwNumFmt& r ) const { return !(*this == r); } - SwCharFmt* GetCharFmt() const { return (SwCharFmt*)pRegisteredIn; } + SwCharFmt* GetCharFmt() const { return (SwCharFmt*)GetRegisteredIn(); } void SetCharFmt( SwCharFmt* ); - virtual void Modify( SfxPoolItem* pOld, SfxPoolItem* pNew ); + void ForgetCharFmt(); virtual void SetCharFmtName(const String& rSet); virtual const String& GetCharFmtName()const; @@ -142,9 +145,6 @@ private: const SvxNumberFormat::SvxNumPositionAndSpaceMode meDefaultNumberFormatPositionAndSpaceMode; String msDefaultListId; - // forbidden and not implemented. - SwNumRule(); - public: // add parameter <eDefaultNumberFormatPositionAndSpaceMode> SwNumRule( const String& rNm, diff --git a/sw/inc/pagedesc.hxx b/sw/inc/pagedesc.hxx index 156d5b2e1fc2..876540626620 100644 --- a/sw/inc/pagedesc.hxx +++ b/sw/inc/pagedesc.hxx @@ -162,6 +162,9 @@ class SW_DLLPUBLIC SwPageDesc : public SwModify SW_DLLPRIVATE SwPageDesc(const String&, SwFrmFmt*, SwDoc *pDc ); +protected: + virtual void Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNewValue ); + public: const String &GetName() const { return aDescName; } void SetName( const String& rNewName ) { aDescName = rNewName; } @@ -215,7 +218,6 @@ public: void SetRegisterFmtColl( const SwTxtFmtColl* rFmt ); const SwTxtFmtColl* GetRegisterFmtColl() const; - virtual void Modify( SfxPoolItem *pOldValue, SfxPoolItem *pNewValue ); void RegisterChange(); // Query and set PoolFormat-Id. diff --git a/sw/inc/paratr.hxx b/sw/inc/paratr.hxx index 54eff6a7cd26..d88201639530 100644 --- a/sw/inc/paratr.hxx +++ b/sw/inc/paratr.hxx @@ -65,6 +65,10 @@ public: private: // @@@ public copy ctor, but no copy assignment? SwFmtDrop & operator= (const SwFmtDrop &); + +protected: + virtual void Modify( const SfxPoolItem*, const SfxPoolItem* ); + public: // "pure virtual methods" of SfxPoolItem @@ -90,10 +94,9 @@ public: inline sal_uInt16 GetDistance() const { return nDistance; } inline sal_uInt16 &GetDistance() { return nDistance; } - inline const SwCharFmt *GetCharFmt() const { return (SwCharFmt*)pRegisteredIn; } - inline SwCharFmt *GetCharFmt() { return (SwCharFmt*)pRegisteredIn; } + inline const SwCharFmt *GetCharFmt() const { return (SwCharFmt*)GetRegisteredIn(); } + inline SwCharFmt *GetCharFmt() { return (SwCharFmt*)GetRegisteredIn(); } void SetCharFmt( SwCharFmt *pNew ); - virtual void Modify( SfxPoolItem*, SfxPoolItem* ); // Get information from Client. virtual sal_Bool GetInfo( SfxPoolItem& ) const; diff --git a/sw/inc/printdata.hxx b/sw/inc/printdata.hxx index a93ff9957695..cc0a239815a1 100644 --- a/sw/inc/printdata.hxx +++ b/sw/inc/printdata.hxx @@ -46,7 +46,8 @@ class _SetGetExpFlds; class SwViewOption; class OutputDevice; class SwViewOptionAdjust_Impl; -class SwWrtShell; +class SwPrtOptions; +class ViewShell; class SfxViewShell; // forward declarations @@ -267,9 +268,9 @@ public: void DeletePostItData(); bool IsViewOptionAdjust() const { return m_pViewOptionAdjust != 0; } - bool NeedNewViewOptionAdjust( const SwWrtShell& ) const; - void ViewOptionAdjustStart( SwWrtShell &rSh, const SwViewOption &rViewOptions ); - void ViewOptionAdjust( SwPrintData const*const pPrtOptions ); + bool NeedNewViewOptionAdjust( const ViewShell& ) const; + void ViewOptionAdjustStart( ViewShell &rSh, const SwViewOption &rViewOptions ); + void ViewOptionAdjust( SwPrintData const* const pPrtOptions ); void ViewOptionAdjustStop(); bool HasSwPrtOptions() const { return m_pPrtOptions != 0; } diff --git a/sw/inc/reffld.hxx b/sw/inc/reffld.hxx index 06b897576279..5b2b6cc10b66 100644 --- a/sw/inc/reffld.hxx +++ b/sw/inc/reffld.hxx @@ -73,13 +73,14 @@ enum REFERENCEMARK class SwGetRefFieldType : public SwFieldType { SwDoc* pDoc; +protected: + // ueberlagert, um alle Ref-Felder zu updaten + virtual void Modify( const SfxPoolItem*, const SfxPoolItem * ); public: SwGetRefFieldType(SwDoc* pDoc ); virtual SwFieldType* Copy() const; SwDoc* GetDoc() const { return pDoc; } - // ueberlagert, um alle Ref-Felder zu updaten - virtual void Modify( SfxPoolItem *, SfxPoolItem * ); void MergeWithOtherDoc( SwDoc& rDestDoc ); diff --git a/sw/inc/section.hxx b/sw/inc/section.hxx index 5a30cc0b502d..f636756f39e5 100644 --- a/sw/inc/section.hxx +++ b/sw/inc/section.hxx @@ -154,7 +154,6 @@ public: class SW_DLLPUBLIC SwSection : public SwClient - , private ::boost::noncopyable { // damit beim Anlegen/Loeschen von Frames das Flag richtig gepflegt wird! friend class SwSectionNode; @@ -170,6 +169,9 @@ private: SW_DLLPRIVATE void ImplSetHiddenFlag( bool const bHidden, bool const bCondition); +protected: + virtual void Modify( const SfxPoolItem* pOld, const SfxPoolItem* pNew ); + public: TYPEINFO(); // rtti @@ -186,10 +188,8 @@ public: SectionType GetType() const { return m_Data.GetType(); } void SetType(SectionType const eType) { return m_Data.SetType(eType); } - SwSectionFmt* GetFmt() { return (SwSectionFmt*)pRegisteredIn; } - SwSectionFmt* GetFmt() const { return (SwSectionFmt*)pRegisteredIn; } - - virtual void Modify( SfxPoolItem* pOld, SfxPoolItem* pNew ); + SwSectionFmt* GetFmt() { return (SwSectionFmt*)GetRegisteredIn(); } + SwSectionFmt* GetFmt() const { return (SwSectionFmt*)GetRegisteredIn(); } // setze die Hidden/Protected -> gesamten Baum updaten ! // (Attribute/Flags werden gesetzt/erfragt) @@ -287,6 +287,7 @@ class SW_DLLPUBLIC SwSectionFmt protected: SwSectionFmt( SwSectionFmt* pDrvdFrm, SwDoc *pDoc ); + virtual void Modify( const SfxPoolItem* pOld, const SfxPoolItem* pNew ); public: TYPEINFO(); //Bereits in Basisklasse Client drin. @@ -298,7 +299,6 @@ public: //Erzeugt die Ansichten virtual void MakeFrms(); - virtual void Modify( SfxPoolItem* pOld, SfxPoolItem* pNew ); // erfrage vom Format Informationen virtual sal_Bool GetInfo( SfxPoolItem& ) const; diff --git a/sw/inc/swcrsr.hxx b/sw/inc/swcrsr.hxx index 57c41714e75a..2376e80775e8 100644 --- a/sw/inc/swcrsr.hxx +++ b/sw/inc/swcrsr.hxx @@ -96,11 +96,7 @@ public: // @@@ semantic: no copy ctor. SwCursor( SwCursor& rCpy); -private: - // forbidden and not implemented. - //SwCursor( const SwCursor& ); - // @@@ used e.g. in core/frmedt/fetab.cxx @@@ - // SwCursor & operator= ( const SwCursor& ); + public: virtual SwCursor* Create( SwPaM* pRing = 0 ) const; @@ -140,7 +136,7 @@ public: sal_Bool GoEndWord(); sal_Bool GoNextWord(); sal_Bool GoPrevWord(); - sal_Bool SelectWord( const Point* pPt = 0 ); + sal_Bool SelectWord( ViewShell* pViewShell, const Point* pPt = 0 ); // API versions of above functions (will be used with a different // WordType for the break iterator) @@ -151,7 +147,7 @@ public: sal_Bool GoEndWordWT( sal_Int16 nWordType ); sal_Bool GoNextWordWT( sal_Int16 nWordType ); sal_Bool GoPrevWordWT( sal_Int16 nWordType ); - sal_Bool SelectWordWT( sal_Int16 nWordType, const Point* pPt = 0 ); + sal_Bool SelectWordWT( ViewShell* pViewShell, sal_Int16 nWordType, const Point* pPt = 0 ); enum SentenceMoveType { diff --git a/sw/inc/swddetbl.hxx b/sw/inc/swddetbl.hxx index 57e000a998c5..e266465656c2 100644 --- a/sw/inc/swddetbl.hxx +++ b/sw/inc/swddetbl.hxx @@ -43,12 +43,14 @@ public: sal_Bool bUpdate = sal_True ); ~SwDDETable(); - void Modify( SfxPoolItem*, SfxPoolItem* ); void ChangeContent(); sal_Bool NoDDETable(); SwDDEFieldType* GetDDEFldType(); inline const SwDDEFieldType* GetDDEFldType() const; +protected: + virtual void Modify( const SfxPoolItem*, const SfxPoolItem* ); + virtual void SwClientNotify( const SwModify&, const SfxHint& ); }; diff --git a/sw/inc/switerator.hxx b/sw/inc/switerator.hxx new file mode 100755 index 000000000000..be729771b54b --- /dev/null +++ b/sw/inc/switerator.hxx @@ -0,0 +1,47 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ +#ifndef _SWITERATOR_HXX +#define _SWITERATOR_HXX + +#include <calbck.hxx> +#include <tools/debug.hxx> + +template< class TElementType, class TSource > class SwIterator +{ + SwClientIter aClientIter; +public: + + SwIterator( const TSource& rSrc ) : aClientIter(rSrc) { DBG_ASSERT( TElementType::IsOf( TYPE(SwClient) ), "Incompatible types!" ); } + TElementType* First() { SwClient* p = aClientIter.First(TYPE(TElementType)); return PTR_CAST(TElementType,p); } + TElementType* Last() { SwClient* p = aClientIter.Last( TYPE(TElementType)); return PTR_CAST(TElementType,p); } + TElementType* Next() { SwClient* p = aClientIter.Next(); return PTR_CAST(TElementType,p); } + TElementType* Previous() { SwClient* p = aClientIter.Previous(); return PTR_CAST(TElementType,p); } + static TElementType* FirstElement( const TSource& rMod ) { SwClient* p = SwClientIter(rMod).First(TYPE(TElementType)); return PTR_CAST(TElementType,p); } + bool IsChanged() { return aClientIter.IsChanged(); } +}; + +#endif diff --git a/sw/inc/swtable.hxx b/sw/inc/swtable.hxx index 7df49e2cd355..8f8e70e8a333 100644 --- a/sw/inc/swtable.hxx +++ b/sw/inc/swtable.hxx @@ -43,6 +43,7 @@ class SwStartNode; #include <node.hxx> // fuer StartNode->GetMyIndex #endif +class SwFmt; class Color; class SwFrmFmt; class SwTableFmt; @@ -86,7 +87,7 @@ typedef SwTableLine* SwTableLinePtr; class SW_DLLPUBLIC SwTable: public SwClient //Client vom FrmFmt { - using SwClient::IsModifyLocked; + protected: SwTableLines aLines; @@ -116,6 +117,8 @@ protected: sal_Bool IsModifyLocked(){ return bModifyLocked;} + virtual void Modify( const SfxPoolItem* pOld, const SfxPoolItem* pNew ); + public: enum SearchType { @@ -175,10 +178,9 @@ public: SwTableLines &GetTabLines() { return aLines; } const SwTableLines &GetTabLines() const { return aLines; } - SwFrmFmt* GetFrmFmt() { return (SwFrmFmt*)pRegisteredIn; } - SwFrmFmt* GetFrmFmt() const { return (SwFrmFmt*)pRegisteredIn; } - - virtual void Modify( SfxPoolItem* pOld, SfxPoolItem* pNew ); + SwFrmFmt* GetFrmFmt() { return (SwFrmFmt*)GetRegisteredIn(); } + SwFrmFmt* GetFrmFmt() const { return (SwFrmFmt*)GetRegisteredIn(); } + SwTableFmt* GetTableFmt() const { return (SwTableFmt*)GetRegisteredIn(); } void GetTabCols( SwTabCols &rToFill, const SwTableBox *pStart, sal_Bool bHidden = sal_False, sal_Bool bCurRowOnly = sal_False ) const; @@ -320,6 +322,7 @@ public: SwTwips nAbsDiff, SwTwips nRelDiff, SwUndo** ppUndo ); sal_Bool SetRowHeight( SwTableBox& rAktBox, sal_uInt16 eType, SwTwips nAbsDiff, SwTwips nRelDiff, SwUndo** ppUndo ); + void RegisterToFormat( SwFmt& rFmt ); #if OSL_DEBUG_LEVEL > 1 void CheckConsistency() const; #endif @@ -346,8 +349,8 @@ public: void SetUpper( SwTableBox *pNew ) { pUpper = pNew; } - SwFrmFmt* GetFrmFmt() { return (SwFrmFmt*)pRegisteredIn; } - SwFrmFmt* GetFrmFmt() const { return (SwFrmFmt*)pRegisteredIn; } + SwFrmFmt* GetFrmFmt() { return (SwFrmFmt*)GetRegisteredIn(); } + SwFrmFmt* GetFrmFmt() const { return (SwFrmFmt*)GetRegisteredIn(); } //Macht ein eingenes FrmFmt wenn noch mehr Lines von ihm abhaengen. SwFrmFmt* ClaimFrmFmt(); @@ -362,6 +365,7 @@ public: SwTwips GetTableLineHeight( bool& bLayoutAvailable ) const; bool hasSoftPageBreak() const; + void RegisterToFormat( SwFmt& rFmt ); }; class SW_DLLPUBLIC SwTableBox: public SwClient //Client vom FrmFmt @@ -400,8 +404,8 @@ public: const SwTableLine *GetUpper() const { return pUpper; } void SetUpper( SwTableLine *pNew ) { pUpper = pNew; } - SwFrmFmt* GetFrmFmt() { return (SwFrmFmt*)pRegisteredIn; } - SwFrmFmt* GetFrmFmt() const { return (SwFrmFmt*)pRegisteredIn; } + SwFrmFmt* GetFrmFmt() { return (SwFrmFmt*)GetRegisteredIn(); } + SwFrmFmt* GetFrmFmt() const { return (SwFrmFmt*)GetRegisteredIn(); } //Macht ein eingenes FrmFmt wenn noch mehr Boxen von ihm abhaengen. SwFrmFmt* ClaimFrmFmt(); @@ -466,6 +470,8 @@ public: const SwTableBox& FindEndOfRowSpan( const SwTable& rTable, sal_uInt16 nMaxStep = USHRT_MAX ) const { return const_cast<SwTableBox*>(this)->FindEndOfRowSpan( rTable, nMaxStep ); } + void RegisterToFormat( SwFmt& rFmt ) ; + void ForgetFrmFmt(); }; class SwCellFrm; diff --git a/sw/inc/swtblfmt.hxx b/sw/inc/swtblfmt.hxx index fb7a63efb9b4..5165c76ec960 100644 --- a/sw/inc/swtblfmt.hxx +++ b/sw/inc/swtblfmt.hxx @@ -87,12 +87,12 @@ protected: : SwFrmFmt( rPool, rFmtNm, pDrvdFrm, RES_FRMFMT, aTableBoxSetRange ) {} + // zum Erkennen von Veraenderungen (haupts. TableBoxAttribute) + virtual void Modify( const SfxPoolItem* pOld, const SfxPoolItem* pNewValue ); + public: TYPEINFO(); //Bereits in Basisklasse Client drin. - // zum Erkennen von Veraenderungen (haupts. TableBoxAttribute) - virtual void Modify( SfxPoolItem* pOldValue, SfxPoolItem* pNewValue ); - DECL_FIXEDMEMPOOL_NEWDEL(SwTableBoxFmt) }; diff --git a/sw/inc/swtypes.hxx b/sw/inc/swtypes.hxx index 87399c808ef6..15977766c25f 100644 --- a/sw/inc/swtypes.hxx +++ b/sw/inc/swtypes.hxx @@ -223,6 +223,8 @@ namespace nsSetAttrMode // functionality will be disabled) /// force hint expand (only matters for hints with CH_TXTATR) const SetAttrMode SETATTR_FORCEHINTEXPAND= 0x0080; + /// the inserted item is a copy -- intended for use in ndtxt.cxx + const SetAttrMode SETATTR_IS_COPY = 0x0100; } //Umrechnung Twip<-> 1/100 mm fuer UNO diff --git a/sw/inc/tox.hxx b/sw/inc/tox.hxx index 1f5bf0530f9b..bff0b9ded740 100644 --- a/sw/inc/tox.hxx +++ b/sw/inc/tox.hxx @@ -92,6 +92,10 @@ class SW_DLLPUBLIC SwTOXMark SwTOXMark(); // to create the dflt. atr. in _InitCore +protected: + // SwClient + virtual void Modify( const SfxPoolItem* pOld, const SfxPoolItem* pNew ); + public: TYPEINFO(); // rtti @@ -106,9 +110,6 @@ public: virtual int operator==( const SfxPoolItem& ) const; virtual SfxPoolItem* Clone( SfxItemPool* pPool = 0 ) const; - // SwClient - virtual void Modify( SfxPoolItem* pOld, SfxPoolItem* pNew ); - void InvalidateTOXMark(); String GetText() const; @@ -152,7 +153,9 @@ public: SW_DLLPRIVATE void SetXTOXMark(::com::sun::star::uno::Reference< ::com::sun::star::text::XDocumentIndexMark> const& xMark) { m_wXDocumentIndexMark = xMark; } - + void DeRegister() { GetRegisteredInNonConst()->Remove( this ); } + void RegisterToTOXType( SwTOXType& rMark ); + static void InsertTOXMarks( SwTOXMarks& aMarks, const SwTOXType& rType ); }; /*-------------------------------------------------------------------- @@ -579,6 +582,7 @@ public: // #i21237# void AdjustTabStops(SwDoc & rDoc, sal_Bool bDefaultRightTabStop); SwTOXBase& operator=(const SwTOXBase& rSource); + void RegisterToTOXType( SwTOXType& rMark ); }; diff --git a/sw/inc/txtatr.hxx b/sw/inc/txtatr.hxx index c3b816cc0d88..5224ec80b38f 100644 --- a/sw/inc/txtatr.hxx +++ b/sw/inc/txtatr.hxx @@ -35,6 +35,11 @@ class SwTxtNode; // fuer SwTxtFld class SwCharFmt; +namespace sw { + class MetaFieldManager; +} + + // ATT_CHARFMT ********************************************* class SwTxtCharFmt : public SwTxtAttrEnd @@ -46,9 +51,9 @@ public: SwTxtCharFmt( SwFmtCharFmt& rAttr, xub_StrLen nStart, xub_StrLen nEnd ); virtual ~SwTxtCharFmt( ); - // werden vom SwFmtCharFmt hierher weitergeleitet - virtual void Modify( SfxPoolItem*, SfxPoolItem* ); // SwClient - virtual sal_Bool GetInfo( SfxPoolItem& rInfo ) const; + // werden vom SwFmtCharFmt hierher weitergeleitet (no derivation from SwClient!) + void ModifyNotification( const SfxPoolItem*, const SfxPoolItem* ); + bool GetInfo( SfxPoolItem& rInfo ) const; // get and set TxtNode pointer void ChgTxtNode( SwTxtNode* pNew ) { m_pTxtNode = pNew; } @@ -62,7 +67,7 @@ public: class SwTxtAttrNesting : public SwTxtAttrEnd { -public: +protected: SwTxtAttrNesting( SfxPoolItem & i_rAttr, const xub_StrLen i_nStart, const xub_StrLen i_nEnd ); virtual ~SwTxtAttrNesting(); @@ -71,16 +76,20 @@ public: class SwTxtMeta : public SwTxtAttrNesting { private: - SwTxtNode * m_pTxtNode; - -public: SwTxtMeta( SwFmtMeta & i_rAttr, const xub_StrLen i_nStart, const xub_StrLen i_nEnd ); + +public: + static SwTxtMeta * CreateTxtMeta( + ::sw::MetaFieldManager & i_rTargetDocManager, + SwTxtNode *const i_pTargetTxtNode, + SwFmtMeta & i_rAttr, + xub_StrLen const i_nStart, xub_StrLen const i_nEnd, + bool const i_bIsCopy); + virtual ~SwTxtMeta(); void ChgTxtNode(SwTxtNode * const pNode); - SwTxtNode * GetTxtNode() const { return m_pTxtNode; } - }; @@ -89,15 +98,17 @@ public: class SW_DLLPUBLIC SwTxtRuby : public SwTxtAttrNesting, public SwClient { SwTxtNode* m_pTxtNode; - +protected: + virtual void Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew); public: SwTxtRuby( SwFmtRuby& rAttr, xub_StrLen nStart, xub_StrLen nEnd ); virtual ~SwTxtRuby(); TYPEINFO(); - virtual void Modify( SfxPoolItem *pOld, SfxPoolItem *pNew); virtual sal_Bool GetInfo( SfxPoolItem& rInfo ) const; + SW_DLLPRIVATE void InitRuby(SwTxtNode & rNode); + /// get and set TxtNode pointer const SwTxtNode* GetpTxtNode() const { return m_pTxtNode; } inline const SwTxtNode& GetTxtNode() const; diff --git a/sw/inc/txtftn.hxx b/sw/inc/txtftn.hxx index 36fbfb0ee269..d48bcf7c8dff 100644 --- a/sw/inc/txtftn.hxx +++ b/sw/inc/txtftn.hxx @@ -34,6 +34,7 @@ class SwNodeIndex; class SwTxtNode; class SwNodes; class SwDoc; +class SwFrm; // ATT_FTN ********************************************************** @@ -60,7 +61,7 @@ public: void MakeNewTextSection( SwNodes& rNodes ); // loesche die FtnFrame aus der Seite - void DelFrms(); + void DelFrms( const SwFrm* ); // bedingten Absatzvorlagen checken void CheckCondColl(); diff --git a/sw/inc/txtinet.hxx b/sw/inc/txtinet.hxx index d09792c915cf..f6e35addb183 100644 --- a/sw/inc/txtinet.hxx +++ b/sw/inc/txtinet.hxx @@ -43,17 +43,18 @@ class SW_DLLPUBLIC SwTxtINetFmt : public SwTxtAttrNesting, public SwClient bool m_bVisited : 1; // visited link? bool m_bVisitedValid : 1; // is m_bVisited valid? - // forbidden and not implemented. - SwTxtINetFmt(); +protected: +virtual void Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew); public: SwTxtINetFmt( SwFmtINetFmt& rAttr, xub_StrLen nStart, xub_StrLen nEnd ); virtual ~SwTxtINetFmt(); TYPEINFO(); - virtual void Modify( SfxPoolItem *pOld, SfxPoolItem *pNew); virtual sal_Bool GetInfo( SfxPoolItem& rInfo ) const; + SW_DLLPRIVATE void InitINetFmt(SwTxtNode & rNode); + // get and set TxtNode pointer const SwTxtNode* GetpTxtNode() const { return m_pTxtNode; } inline const SwTxtNode& GetTxtNode() const; diff --git a/sw/inc/txtrfmrk.hxx b/sw/inc/txtrfmrk.hxx index c7507798be87..d60dd47cad4c 100644 --- a/sw/inc/txtrfmrk.hxx +++ b/sw/inc/txtrfmrk.hxx @@ -42,7 +42,7 @@ class SwTxtRefMark : public SwTxtAttrEnd public: SwTxtRefMark( SwFmtRefMark& rAttr, - xub_StrLen nStart, xub_StrLen * pEnd = 0 ); + xub_StrLen const nStart, xub_StrLen const*const pEnd = 0); virtual xub_StrLen * GetEnd(); // SwTxtAttr inline const xub_StrLen * GetEnd() const { return m_pEnd; } diff --git a/sw/inc/txttxmrk.hxx b/sw/inc/txttxmrk.hxx index e70c28305082..56a928b98ce2 100644 --- a/sw/inc/txttxmrk.hxx +++ b/sw/inc/txttxmrk.hxx @@ -42,7 +42,8 @@ class SwTxtTOXMark : public SwTxtAttrEnd xub_StrLen * m_pEnd; // 0 if SwTOXMark without AlternativeText public: - SwTxtTOXMark( SwTOXMark& rAttr, xub_StrLen nStart, xub_StrLen * pEnd = 0 ); + SwTxtTOXMark( SwTOXMark& rAttr, + xub_StrLen const nStart, xub_StrLen const*const pEnd = 0); virtual ~SwTxtTOXMark(); virtual xub_StrLen *GetEnd(); // SwTxtAttr diff --git a/sw/inc/unobaseclass.hxx b/sw/inc/unobaseclass.hxx index e49568b6256f..f04bb1adb04d 100644 --- a/sw/inc/unobaseclass.hxx +++ b/sw/inc/unobaseclass.hxx @@ -95,7 +95,7 @@ class UnoActionRemoveContext ::com::sun::star::uno::Sequence< sal_Int8 > CreateUnoTunnelId(); /// helper function for implementing SwClient::Modify -void ClientModify(SwClient* pClient, SfxPoolItem *pOld, SfxPoolItem *pNew); +void ClientModify(SwClient* pClient, const SfxPoolItem *pOld, const SfxPoolItem *pNew); #include <boost/utility.hpp> diff --git a/sw/inc/unobookmark.hxx b/sw/inc/unobookmark.hxx index 4d76fca66849..474257b4a011 100644 --- a/sw/inc/unobookmark.hxx +++ b/sw/inc/unobookmark.hxx @@ -223,8 +223,9 @@ class SwXFieldmarkParameters // XElementAccess virtual ::com::sun::star::uno::Type SAL_CALL getElementType( ) throw (::com::sun::star::uno::RuntimeException); virtual ::sal_Bool SAL_CALL hasElements( ) throw (::com::sun::star::uno::RuntimeException); + protected: //SwClient - virtual void Modify(SfxPoolItem *pOld, SfxPoolItem *pNew); + virtual void Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew ); private: ::sw::mark::IFieldmark::parameter_map_t* getCoreParameters() throw (::com::sun::star::uno::RuntimeException); }; diff --git a/sw/inc/unochart.hxx b/sw/inc/unochart.hxx index c88d62be1d9e..02da7c5fb805 100644 --- a/sw/inc/unochart.hxx +++ b/sw/inc/unochart.hxx @@ -172,6 +172,10 @@ class SwChartDataProvider : rtl::OUString GetBrokenCellRangeForExport( const rtl::OUString &rCellRangeRepresentation ); +protected: + //SwClient + virtual void Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew); + public: SwChartDataProvider( const SwDoc* pDoc ); virtual ~SwChartDataProvider(); @@ -198,10 +202,6 @@ public: virtual sal_Bool SAL_CALL supportsService( const ::rtl::OUString& ServiceName ) throw (::com::sun::star::uno::RuntimeException); virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getSupportedServiceNames( ) throw (::com::sun::star::uno::RuntimeException); - //SwClient - virtual void Modify( SfxPoolItem *pOld, SfxPoolItem *pNew); - - SwFrmFmt* GetFrmFmt() const { return (SwFrmFmt*)GetRegisteredIn(); } void AddDataSequence( const SwTable &rTable, ::com::sun::star::uno::Reference< ::com::sun::star::chart2::data::XDataSequence > &rxDataSequence ); @@ -293,6 +293,10 @@ class SwChartDataSequence : SwChartDataSequence( const SwChartDataSequence &rObj ); SwChartDataSequence & operator = ( const SwChartDataSequence & ); +protected: + //SwClient + virtual void Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew); + public: SwChartDataSequence( SwChartDataProvider &rProvider, SwFrmFmt &rTblFmt, @@ -349,11 +353,6 @@ public: virtual void SAL_CALL addEventListener( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XEventListener >& xListener ) throw (::com::sun::star::uno::RuntimeException); virtual void SAL_CALL removeEventListener( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XEventListener >& aListener ) throw (::com::sun::star::uno::RuntimeException); - - //SwClient - virtual void Modify( SfxPoolItem *pOld, SfxPoolItem *pNew); - - SwFrmFmt* GetFrmFmt() const { return (SwFrmFmt*)GetRegisteredIn(); } sal_Bool DeleteBox( const SwTableBox &rBox ); diff --git a/sw/inc/unocrsr.hxx b/sw/inc/unocrsr.hxx index 0fc9b61b557a..26f193a9dc81 100644 --- a/sw/inc/unocrsr.hxx +++ b/sw/inc/unocrsr.hxx @@ -41,11 +41,6 @@ public: SwUnoCrsr( const SwPosition &rPos, SwPaM* pRing = 0 ); virtual ~SwUnoCrsr(); - // @@@ semantic: no copy ctor. - SwUnoCrsr( SwUnoCrsr& ); -private: - SwUnoCrsr & operator= ( const SwUnoCrsr& ); - protected: virtual const SwCntntFrm* DoSetBidiLevelLeftRight( diff --git a/sw/inc/unodraw.hxx b/sw/inc/unodraw.hxx index d45b83e9d6cf..7cc830cf6a96 100644 --- a/sw/inc/unodraw.hxx +++ b/sw/inc/unodraw.hxx @@ -232,6 +232,9 @@ class SwXShape : public SwXShapeBaseClass, protected: virtual ~SwXShape(); + //SwClient + virtual void Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew); + public: SwXShape(::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > & xShape); @@ -281,9 +284,6 @@ public: virtual void SAL_CALL setSize( const ::com::sun::star::awt::Size& aSize ) throw (::com::sun::star::beans::PropertyVetoException, ::com::sun::star::uno::RuntimeException); virtual ::rtl::OUString SAL_CALL getShapeType( ) throw (::com::sun::star::uno::RuntimeException); - //SwClient - virtual void Modify( SfxPoolItem *pOld, SfxPoolItem *pNew); - SwShapeDescriptor_Impl* GetDescImpl() {return pImpl;} ::com::sun::star::uno::Reference< ::com::sun::star::uno::XAggregation > GetAggregationInterface() {return xShapeAgg;} diff --git a/sw/inc/unofield.hxx b/sw/inc/unofield.hxx index ed36b278a652..6dc306cdb300 100644 --- a/sw/inc/unofield.hxx +++ b/sw/inc/unofield.hxx @@ -75,6 +75,9 @@ class SwXFieldMaster : public cppu::WeakImplHelper4 protected: virtual ~SwXFieldMaster(); + //SwClient +virtual void Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew); + public: SwXFieldMaster(SwDoc* pDoc, sal_uInt16 nResId); @@ -107,9 +110,6 @@ public: virtual sal_Bool SAL_CALL supportsService(const rtl::OUString& ServiceName) throw( ::com::sun::star::uno::RuntimeException ); virtual ::com::sun::star::uno::Sequence< rtl::OUString > SAL_CALL getSupportedServiceNames(void) throw( ::com::sun::star::uno::RuntimeException ); - //SwClient - virtual void Modify( SfxPoolItem *pOld, SfxPoolItem *pNew); - static rtl::OUString GetProgrammaticName(const SwFieldType& rType, SwDoc& rDoc); static rtl::OUString LocalizeFormula(const SwSetExpField& rFld, const rtl::OUString& rFormula, sal_Bool bQuery); @@ -148,6 +148,9 @@ class SwXTextField : public cppu::WeakImplHelper5 SwDoc* GetDoc() {return m_pDoc;} protected: virtual ~SwXTextField(); + //SwClient + virtual void Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew); + public: SwXTextField(sal_uInt16 nServiceId, SwDoc* pDoc=0); SwXTextField(const SwFmtFld& rFmt, SwDoc* pDoc); @@ -193,19 +196,16 @@ public: //XUpdatable virtual void SAL_CALL update( ) throw (::com::sun::star::uno::RuntimeException); - //SwClient - virtual void Modify( SfxPoolItem *pOld, SfxPoolItem *pNew); - void attachToRange(const ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextRange > & xTextRange)throw( ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException ); const SwField* GetField() const; const SwFmtFld* GetFldFmt(){return GetField() ? pFmtFld : 0; }; void Invalidate(); -}; -/// @return a SwXTextField, either an already existing one or a new one -SwXTextField * CreateSwXTextField(SwDoc & rDoc, SwFmtFld const& rFmt); + /// @return an SwXTextField, either an already existing one or a new one + static SwXTextField* CreateSwXTextField(SwDoc & rDoc, SwFmtFld const& rFmt); +}; typedef cppu::WeakImplHelper2 @@ -294,6 +294,8 @@ class SwXFieldEnumeration : public cppu::WeakImplHelper2 protected: virtual ~SwXFieldEnumeration(); + //SwClient + virtual void Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew); public: SwXFieldEnumeration(SwDoc* pDoc); @@ -306,8 +308,6 @@ public: virtual sal_Bool SAL_CALL supportsService(const rtl::OUString& ServiceName) throw( ::com::sun::star::uno::RuntimeException ); virtual ::com::sun::star::uno::Sequence< rtl::OUString > SAL_CALL getSupportedServiceNames(void) throw( ::com::sun::star::uno::RuntimeException ); - //SwClient - virtual void Modify( SfxPoolItem *pOld, SfxPoolItem *pNew); }; #endif diff --git a/sw/inc/unoflatpara.hxx b/sw/inc/unoflatpara.hxx index 9eb36c20c1b3..2ab3e5988aa2 100644 --- a/sw/inc/unoflatpara.hxx +++ b/sw/inc/unoflatpara.hxx @@ -123,8 +123,9 @@ public: virtual css::uno::Reference< css::text::XFlatParagraph > SAL_CALL getParaBefore(const css::uno::Reference< css::text::XFlatParagraph > & xPara) throw (css::uno::RuntimeException, css::lang::IllegalArgumentException); virtual css::uno::Reference< css::text::XFlatParagraph > SAL_CALL getParaAfter(const css::uno::Reference< css::text::XFlatParagraph > & xPara) throw (css::uno::RuntimeException, css::lang::IllegalArgumentException); +protected: // SwClient - virtual void Modify( SfxPoolItem *pOld, SfxPoolItem *pNew ); + virtual void Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew ); private: SwXFlatParagraphIterator( const SwXFlatParagraphIterator & ); // not defined diff --git a/sw/inc/unoframe.hxx b/sw/inc/unoframe.hxx index 903ed043ac74..3642a8c089e8 100644 --- a/sw/inc/unoframe.hxx +++ b/sw/inc/unoframe.hxx @@ -56,7 +56,6 @@ class SwDoc; class SwFmt; class SwFlyFrmFmt; - class BaseFrameProperties_Impl; class SwXFrame : public cppu::WeakImplHelper6 < @@ -85,6 +84,7 @@ class SwXFrame : public cppu::WeakImplHelper6 protected: com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > mxStyleData; com::sun::star::uno::Reference< ::com::sun::star::container::XNameAccess > mxStyleFamily; + virtual void Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew); virtual ~SwXFrame(); public: @@ -143,9 +143,6 @@ public: virtual sal_Bool SAL_CALL supportsService(const rtl::OUString& ServiceName) throw( ::com::sun::star::uno::RuntimeException ); virtual ::com::sun::star::uno::Sequence< rtl::OUString > SAL_CALL getSupportedServiceNames(void) throw( ::com::sun::star::uno::RuntimeException ); - //SwClient - virtual void Modify( SfxPoolItem *pOld, SfxPoolItem *pNew); - void attachToRange(const ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextRange > & xTextRange)throw( ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException ); void attach( const ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextRange >& xTextRange ) throw(::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException); @@ -361,7 +358,8 @@ public: // ::com::sun::star::util::XModifyListener virtual void SAL_CALL modified( const ::com::sun::star::lang::EventObject& aEvent ) throw(::com::sun::star::uno::RuntimeException); - void Modify( SfxPoolItem*, SfxPoolItem* ); +protected: + virtual void Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew); }; diff --git a/sw/inc/unoport.hxx b/sw/inc/unoport.hxx index 4b4f95abaee8..12f93f6fcb56 100644 --- a/sw/inc/unoport.hxx +++ b/sw/inc/unoport.hxx @@ -129,8 +129,9 @@ private: SwFmtFld * GetFldFmt(bool bInit = false); -protected: + void init(const SwUnoCrsr* pPortionCursor); +protected: void SAL_CALL SetPropertyValues_Impl( const ::com::sun::star::uno::Sequence< ::rtl::OUString >& aPropertyNames, @@ -153,6 +154,9 @@ protected: virtual ~SwXTextPortion(); + //SwClient + virtual void Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew); + public: SwXTextPortion(const SwUnoCrsr* pPortionCrsr, ::com::sun::star::uno::Reference< ::com::sun::star::text::XText > const& rParent, SwTextPortionType eType ); SwXTextPortion(const SwUnoCrsr* pPortionCrsr, ::com::sun::star::uno::Reference< ::com::sun::star::text::XText > const& rParent, SwFrmFmt& rFmt ); @@ -220,9 +224,6 @@ public: virtual ::com::sun::star::uno::Reference< ::com::sun::star::container::XEnumeration > SAL_CALL createContentEnumeration(const rtl::OUString& aServiceName) throw( ::com::sun::star::uno::RuntimeException ); virtual ::com::sun::star::uno::Sequence< rtl::OUString > SAL_CALL getAvailableServiceNames() throw( ::com::sun::star::uno::RuntimeException ); - //SwClient - virtual void Modify( SfxPoolItem *pOld, SfxPoolItem *pNew); - void SetRefMark( ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextContent > xMark) { m_xRefMark = xMark; } @@ -305,9 +306,9 @@ public: virtual ::com::sun::star::uno::Sequence< rtl::OUString > SAL_CALL getSupportedServiceNames() throw( ::com::sun::star::uno::RuntimeException ); - +protected: //SwClient - virtual void Modify( SfxPoolItem *pOld, SfxPoolItem *pNew); + virtual void Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew); }; #endif diff --git a/sw/inc/unoredline.hxx b/sw/inc/unoredline.hxx index bf0a0173808f..0386830a2e39 100644 --- a/sw/inc/unoredline.hxx +++ b/sw/inc/unoredline.hxx @@ -141,10 +141,10 @@ public: virtual ::com::sun::star::uno::Type SAL_CALL getElementType( ) throw(::com::sun::star::uno::RuntimeException); virtual sal_Bool SAL_CALL hasElements( ) throw(::com::sun::star::uno::RuntimeException); - //SwClient - virtual void Modify( SfxPoolItem *pOld, SfxPoolItem *pNew); - const SwRedline* GetRedline() const {return pRedline;} +protected: + //SwClient + virtual void Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew); }; #endif diff --git a/sw/inc/unoredlines.hxx b/sw/inc/unoredlines.hxx index 56ba53446922..af8ed1401bff 100644 --- a/sw/inc/unoredlines.hxx +++ b/sw/inc/unoredlines.hxx @@ -94,9 +94,9 @@ public: virtual rtl::OUString SAL_CALL getImplementationName(void) throw( ::com::sun::star::uno::RuntimeException ); virtual sal_Bool SAL_CALL supportsService(const rtl::OUString& ServiceName) throw( ::com::sun::star::uno::RuntimeException ); virtual ::com::sun::star::uno::Sequence< rtl::OUString > SAL_CALL getSupportedServiceNames(void) throw( ::com::sun::star::uno::RuntimeException ); - +protected: //SwClient - virtual void Modify( SfxPoolItem *pOld, SfxPoolItem *pNew); + virtual void Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew); }; diff --git a/sw/inc/unosett.hxx b/sw/inc/unosett.hxx index c5e75de6eb8f..055732148f87 100644 --- a/sw/inc/unosett.hxx +++ b/sw/inc/unosett.hxx @@ -164,6 +164,10 @@ class SwXNumberingRules : public cppu::WeakAggImplHelper5 static String sInvalidStyle; protected: virtual ~SwXNumberingRules(); + + //SwClient + virtual void Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew); + public: SwXNumberingRules(SwDocShell& rDocSh); // chapter numbering SwXNumberingRules(const SwNumRule& rRule); // NumRule for paragraphs, numbering styles @@ -211,9 +215,6 @@ public: const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue>& rProperties, sal_Int32 nIndex) throw( ::com::sun::star::uno::RuntimeException, ::com::sun::star::lang::IllegalArgumentException ); - //SwClient - virtual void Modify( SfxPoolItem *pOld, SfxPoolItem *pNew); - const String* GetNewCharStyleNames() const {return sNewCharStyleNames;} const String* GetBulletFontNames() const {return sNewBulletFontNames;} const SwNumRule* GetNumRule() {return pNumRule;} diff --git a/sw/inc/unostyle.hxx b/sw/inc/unostyle.hxx index 919c930f1fe6..1fd61f88f871 100644 --- a/sw/inc/unostyle.hxx +++ b/sw/inc/unostyle.hxx @@ -201,6 +201,7 @@ protected: void SAL_CALL SetPropertyValues_Impl( const ::com::sun::star::uno::Sequence< ::rtl::OUString >& aPropertyNames, const ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any >& aValues ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::beans::PropertyVetoException, ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException); ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any > SAL_CALL GetPropertyValues_Impl( const ::com::sun::star::uno::Sequence< ::rtl::OUString >& aPropertyNames ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException); + virtual void Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew); public: SwXStyle(SwDoc* pDoc, SfxStyleFamily eFam = SFX_STYLE_FAMILY_PARA, sal_Bool bConditional = sal_False); SwXStyle(SfxStyleSheetBasePool& rPool, SfxStyleFamily eFam, @@ -274,7 +275,6 @@ public: StartListening(*pBasePool); } SwDoc* GetDoc() const { return m_pDoc; } - virtual void Modify( SfxPoolItem *pOld, SfxPoolItem *pNew); }; class SwXFrameStyle : public SwXStyle, @@ -358,10 +358,12 @@ class SwXAutoStyleFamily : public cppu::WeakImplHelper1< com::sun::star::style:: SwDocShell *pDocShell; IStyleAccess::SwAutoStyleFamily eFamily; +protected: + virtual void Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew); + public: SwXAutoStyleFamily(SwDocShell* pDocShell, IStyleAccess::SwAutoStyleFamily eFamily); virtual ~SwXAutoStyleFamily(); - virtual void Modify( SfxPoolItem *pOld, SfxPoolItem *pNew); //XAutoStyleFamily virtual ::com::sun::star::uno::Reference< ::com::sun::star::style::XAutoStyle > SAL_CALL insertStyle( const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >& Values ) throw (::com::sun::star::uno::RuntimeException); @@ -381,14 +383,15 @@ class SwXAutoStylesEnumerator : public cppu::WeakImplHelper1< ::com::sun::star:: public: SwXAutoStylesEnumerator( SwDoc* pDoc, IStyleAccess::SwAutoStyleFamily eFam ); virtual ~SwXAutoStylesEnumerator(); - virtual void Modify( SfxPoolItem *pOld, SfxPoolItem *pNew); //XEnumeration virtual sal_Bool SAL_CALL hasMoreElements( ) throw (::com::sun::star::uno::RuntimeException); virtual ::com::sun::star::uno::Any SAL_CALL nextElement( ) throw (::com::sun::star::container::NoSuchElementException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException); - +protected: + virtual void Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew); }; + // an automatic style class SwXAutoStyle : public cppu::WeakImplHelper3 < @@ -407,7 +410,6 @@ public: SwXAutoStyle( SwDoc* pDoc, SfxItemSet_Pointer_t pInitSet, IStyleAccess::SwAutoStyleFamily eFam ); virtual ~SwXAutoStyle(); - virtual void Modify( SfxPoolItem *pOld, SfxPoolItem *pNew); //XPropertySet virtual ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySetInfo > SAL_CALL getPropertySetInfo( ) throw(::com::sun::star::uno::RuntimeException); @@ -438,6 +440,9 @@ public: // Special virtual ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue > SAL_CALL getProperties() throw (::com::sun::star::uno::RuntimeException); +protected: + virtual void Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew); + }; #endif diff --git a/sw/inc/unotbl.hxx b/sw/inc/unotbl.hxx index 72c5c6a76865..f4c5c8e2af4d 100644 --- a/sw/inc/unotbl.hxx +++ b/sw/inc/unotbl.hxx @@ -111,6 +111,9 @@ protected: virtual ~SwXCell(); + //SwClient + virtual void Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew); + public: SwXCell(SwFrmFmt* pTblFmt, SwTableBox* pBox, sal_uInt16 nPos=USHRT_MAX ); SwXCell(SwFrmFmt* pTblFmt, const SwStartNode& rStartNode); // XML import interface @@ -158,9 +161,6 @@ public: virtual sal_Bool SAL_CALL supportsService(const rtl::OUString& ServiceName) throw( ::com::sun::star::uno::RuntimeException ); virtual ::com::sun::star::uno::Sequence< rtl::OUString > SAL_CALL getSupportedServiceNames(void) throw( ::com::sun::star::uno::RuntimeException ); - //SwClient - virtual void Modify( SfxPoolItem *pOld, SfxPoolItem *pNew); - //XEnumerationAccess - frueher XParagraphEnumerationAccess virtual ::com::sun::star::uno::Reference< ::com::sun::star::container::XEnumeration > SAL_CALL createEnumeration(void) throw( ::com::sun::star::uno::RuntimeException ); @@ -188,6 +188,9 @@ class SwXTextTableRow : public cppu::WeakImplHelper2 SwFrmFmt* GetFrmFmt() const { return (SwFrmFmt*)GetRegisteredIn(); } protected: virtual ~SwXTextTableRow(); + //SwClient + virtual void Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew); + public: SwXTextTableRow(SwFrmFmt* pFmt, SwTableLine* pLine); @@ -208,9 +211,6 @@ public: virtual sal_Bool SAL_CALL supportsService(const rtl::OUString& ServiceName) throw( ::com::sun::star::uno::RuntimeException ); virtual ::com::sun::star::uno::Sequence< rtl::OUString > SAL_CALL getSupportedServiceNames(void) throw( ::com::sun::star::uno::RuntimeException ); - //SwClient - virtual void Modify( SfxPoolItem *pOld, SfxPoolItem *pNew); - const SwTableLine* GetTblRow() const {return pLine;} static SwTableLine* FindLine(SwTable* pTable, SwTableLine* pLine); }; @@ -264,7 +264,7 @@ public: virtual ::com::sun::star::uno::Sequence< rtl::OUString > SAL_CALL getSupportedServiceNames(void) throw( ::com::sun::star::uno::RuntimeException ); //SwClient - virtual void Modify( SfxPoolItem *pOld, SfxPoolItem *pNew); + virtual void Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew); // ITextCursorHelper virtual const SwPaM* GetPaM() const; @@ -405,7 +405,7 @@ public: SwRangeDescriptor& rDesc); //SwClient - virtual void Modify( SfxPoolItem *pOld, SfxPoolItem *pNew); + virtual void Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew); SwFrmFmt* GetFrmFmt() const { return (SwFrmFmt*)GetRegisteredIn(); } }; @@ -487,7 +487,7 @@ public: virtual ::com::sun::star::uno::Sequence< rtl::OUString > SAL_CALL getSupportedServiceNames(void) throw( ::com::sun::star::uno::RuntimeException ); //SwClient - virtual void Modify( SfxPoolItem *pOld, SfxPoolItem *pNew); + virtual void Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew); SwFrmFmt* GetFrmFmt() const { return (SwFrmFmt*)GetRegisteredIn(); } sal_uInt16 getRowCount(void); @@ -539,7 +539,7 @@ public: virtual ::com::sun::star::uno::Sequence< rtl::OUString > SAL_CALL getSupportedServiceNames(void) throw( ::com::sun::star::uno::RuntimeException ); //SwClient - virtual void Modify( SfxPoolItem *pOld, SfxPoolItem *pNew); + virtual void Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew); }; class SwXTableColumns : public cppu::WeakImplHelper2 @@ -577,7 +577,7 @@ public: virtual ::com::sun::star::uno::Sequence< rtl::OUString > SAL_CALL getSupportedServiceNames(void) throw( ::com::sun::star::uno::RuntimeException ); //SwClient - virtual void Modify( SfxPoolItem *pOld, SfxPoolItem *pNew); + virtual void Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew); }; #endif diff --git a/sw/inc/unotext.hxx b/sw/inc/unotext.hxx index 5e1543acfcde..cb483507b712 100644 --- a/sw/inc/unotext.hxx +++ b/sw/inc/unotext.hxx @@ -289,6 +289,12 @@ public: throw (::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException); + // XTextCopy + virtual void SAL_CALL copyText( + const ::com::sun::star::uno::Reference< + ::com::sun::star::text::XTextCopy >& xSource ) + throw (::com::sun::star::uno::RuntimeException); + // XTextRangeCompare sal_Int16 SAL_CALL compareRegionStarts( const ::com::sun::star::uno::Reference< @@ -332,12 +338,6 @@ public: ::com::sun::star::text::XTextContent>& xPredecessor) throw (::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException); - - // XTextCopy - virtual void SAL_CALL copyText( - const ::com::sun::star::uno::Reference< - ::com::sun::star::text::XTextCopy >& xSource ) - throw (::com::sun::star::uno::RuntimeException); }; #endif // SW_UNOTEXT_HXX diff --git a/sw/inc/unotextmarkup.hxx b/sw/inc/unotextmarkup.hxx index 4b015b95405e..b682a97db6a6 100644 --- a/sw/inc/unotextmarkup.hxx +++ b/sw/inc/unotextmarkup.hxx @@ -66,14 +66,14 @@ public: // ::com::sun::star::text::XMultiTextMarkup: virtual void SAL_CALL commitMultiTextMarkup( const ::com::sun::star::uno::Sequence< ::com::sun::star::text::TextMarkupDescriptor >& aMarkups ) throw (::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException); - //SwClient - virtual void Modify( SfxPoolItem *pOld, SfxPoolItem *pNew); - private: SwXTextMarkup( const SwXTextMarkup & ); // not defined SwXTextMarkup & operator =( const SwXTextMarkup & ); // not defined protected: + //SwClient + virtual void Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew); + SwTxtNode* mpTxtNode; const ModelToViewHelper::ConversionMap* mpConversionMap; diff --git a/sw/inc/unotxdoc.hxx b/sw/inc/unotxdoc.hxx index 82512aa9af5e..7aad16da1d3c 100644 --- a/sw/inc/unotxdoc.hxx +++ b/sw/inc/unotxdoc.hxx @@ -130,8 +130,7 @@ class SfxViewFrame; class SwPrintUIOptions; class SwPrintData; class SwRenderData; -class SwWrtShell; - +class ViewShell; typedef UnoActionContext* UnoActionContextPtr; SV_DECL_PTRARR(ActionContextArr, UnoActionContextPtr, 4, 4) @@ -587,16 +586,14 @@ public: -----------------------------------------------------------------------*/ class SwViewOptionAdjust_Impl { - SwWrtShell & m_rShell; + ViewShell & m_rShell; SwViewOption m_aOldViewOptions; public: - SwViewOptionAdjust_Impl( SwWrtShell& rSh, const SwViewOption &rViewOptions ); + SwViewOptionAdjust_Impl( ViewShell& rSh, const SwViewOption &rViewOptions ); ~SwViewOptionAdjust_Impl(); - - void AdjustViewOptions( SwPrintData const*const pPrtOptions ); - - bool checkShell( const SwWrtShell& rCompare ) const + void AdjustViewOptions( SwPrintData const* const pPrtOptions ); + bool checkShell( const ViewShell& rCompare ) const { return &rCompare == &m_rShell; } }; diff --git a/sw/inc/usrfld.hxx b/sw/inc/usrfld.hxx index 5b041e620d9a..49e7368a4d79 100644 --- a/sw/inc/usrfld.hxx +++ b/sw/inc/usrfld.hxx @@ -62,8 +62,6 @@ public: inline sal_Bool IsValid() const; inline void ChgValid( sal_Bool bNew ); - virtual void Modify( SfxPoolItem* pOld, SfxPoolItem* pNew ); - double GetValue(SwCalc& rCalc); // Member nValue neu berrechnen inline double GetValue() const; inline void SetValue(const double nVal); @@ -76,6 +74,9 @@ public: virtual bool QueryValue( com::sun::star::uno::Any& rVal, sal_uInt16 nMId ) const; virtual bool PutValue( const com::sun::star::uno::Any& rVal, sal_uInt16 nMId ); + +protected: + virtual void Modify( const SfxPoolItem* pOld, const SfxPoolItem* pNew ); }; inline sal_Bool SwUserFieldType::IsValid() const diff --git a/sw/inc/viewopt.hxx b/sw/inc/viewopt.hxx index af12afe42bbc..7da7da2f9c43 100644 --- a/sw/inc/viewopt.hxx +++ b/sw/inc/viewopt.hxx @@ -156,8 +156,9 @@ protected: sal_Bool bStarOneSetting : 1;// prevent from UI automatics (no scrollbars in readonly documents) sal_Bool bIsPagePreview : 1; // the preview mustn't print field/footnote/... shadings sal_Bool bSelectionInReadonly : 1; //determines whether selection is switched on in readonly documents - sal_Bool bFormView : 1; - sal_Bool bBookview : 1; // view mode for page preview + sal_Bool mbFormView : 1; + sal_Bool mbBrowseMode : 1; //swmod 080130 + sal_Bool mbBookView : 1; // view mode for page preview sal_Bool mbViewLayoutBookMode : 1; // book view mode for edit view sal_Bool bShowPlaceHolderFields : 1; //only used in printing! mutable bool bIdle; @@ -400,11 +401,13 @@ public: sal_Bool IsSelectionInReadonly() const {return bSelectionInReadonly;} void SetSelectionInReadonly(sal_Bool bSet) {bSelectionInReadonly = bSet;} - sal_Bool IsFormView() const { return bFormView; } - void SetFormView( sal_Bool bSet ) { bFormView = bSet; } + sal_Bool IsFormView() const { return mbFormView; } + void SetFormView( sal_Bool bSet ) { mbFormView = bSet; } - inline sal_Bool IsPagePrevBookview() const { return bBookview; } - inline void SetPagePrevBookview(sal_Bool bSet) { bBookview = bSet; } + inline sal_Bool getBrowseMode() const { return mbBrowseMode; } + inline void setBrowseMode(sal_Bool bSet) { mbBrowseMode = bSet; } + inline sal_Bool IsPagePrevBookview() const { return mbBookView; } + inline void SetPagePrevBookview(sal_Bool bSet) { mbBookView = bSet; } sal_Bool IsAutoCompleteWords() const; diff --git a/sw/inc/viewsh.hxx b/sw/inc/viewsh.hxx index 7e07979f47a0..27f4d434df44 100644 --- a/sw/inc/viewsh.hxx +++ b/sw/inc/viewsh.hxx @@ -36,6 +36,7 @@ #include <swtypes.hxx> #include <ring.hxx> #include <swrect.hxx> +#include <boost/shared_ptr.hpp>// swmod 080115 #include <vcl/mapmod.hxx> #include <vcl/print.hxx> @@ -95,7 +96,8 @@ namespace vcl // benoetigt werden. // Zur Zeit wird fuer die DrawPage das PreView Flag benoetigt #define VSHELLFLAG_ISPREVIEW ((long)0x1) - +#define VSHELLFLAG_SHARELAYOUT ((long)0x2)//swmod 080125 flag +typedef boost::shared_ptr<SwRootFrm> SwRootFrmPtr; class SW_DLLPUBLIC ViewShell : public Ring { @@ -164,6 +166,8 @@ class SW_DLLPUBLIC ViewShell : public Ring SdrPaintWindow* mpTargetPaintWindow; OutputDevice* mpBufferedOut; + SwRootFrmPtr pLayout; //swmod 080116 + //Initialisierung, wird von den verschiedenen Konstruktoren gerufen. SW_DLLPRIVATE void Init( const SwViewOption *pNewOpt ); @@ -271,7 +275,7 @@ public: //Invalidierung der ersten Sichtbaren Seite fuer alle Shells im Ring. void SetFirstVisPageInvalid(); - SwRootFrm *GetLayout() const; + SwRootFrm *GetLayout() const;//swmod 080116 sal_Bool IsNewLayout() const; //Wurde das Layout geladen oder neu //erzeugt? @@ -279,6 +283,10 @@ public: void CalcLayout(); //Durchformatierung des Layouts erzwingen. + sal_uInt16 GetPageCount() const; + + const Size GetPageSize( sal_uInt16 nPageNum, bool bSkipEmptyPages ) const; + inline SwDoc *GetDoc() const { return pDoc; } //niemals 0. /** Provides access to the document setting interface @@ -420,7 +428,7 @@ public: void LayoutIdle(); inline const SwViewOption *GetViewOptions() const { return pOpt; } - void ApplyViewOptions( const SwViewOption &rOpt ); + virtual void ApplyViewOptions( const SwViewOption &rOpt ); void SetUIOptions( const SwViewOption &rOpt ); void SetReadonlyOption(sal_Bool bSet); // Readonly-Bit d. ViewOptions setzen void SetPDFExportOption(sal_Bool bSet); // set/reset PDF export mode diff --git a/sw/qa/complex/accessibility/makefile.mk b/sw/qa/complex/accessibility/makefile.mk new file mode 100644 index 000000000000..06e7c6a70408 --- /dev/null +++ b/sw/qa/complex/accessibility/makefile.mk @@ -0,0 +1,50 @@ +#************************************************************************* +# +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# Copyright 2000, 2010 Oracle and/or its affiliates. +# +# OpenOffice.org - a multi-platform office productivity suite +# +# This file is part of OpenOffice.org. +# +# OpenOffice.org is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License version 3 +# only, as published by the Free Software Foundation. +# +# OpenOffice.org is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License version 3 for more details +# (a copy is included in the LICENSE file that accompanied this code). +# +# You should have received a copy of the GNU Lesser General Public License +# version 3 along with OpenOffice.org. If not, see +# <http://www.openoffice.org/license.html> +# for a copy of the LGPLv3 License. +# +#************************************************************************* + +.IF "$(OOO_SUBSEQUENT_TESTS)" == "" +nothing .PHONY: +.ELSE + +PRJ = ../../.. +PRJNAME = sw +TARGET = qa_complex_accessibility + +.IF "$(OOO_JUNIT_JAR)" != "" +PACKAGE = complex/accessibility +JAVATESTFILES = AccessibleRelationSet.java +JAVAFILES = $(JAVATESTFILES) +JARFILES = OOoRunner.jar ridl.jar test.jar unoil.jar +EXTRAJARFILES = $(OOO_JUNIT_JAR) +.END + +.INCLUDE: settings.mk +.INCLUDE: target.mk +.INCLUDE: installationtest.mk + +ALLTAR : javatest + +.END diff --git a/sw/qa/complex/checkColor/makefile.mk b/sw/qa/complex/checkColor/makefile.mk new file mode 100644 index 000000000000..e5b368083ada --- /dev/null +++ b/sw/qa/complex/checkColor/makefile.mk @@ -0,0 +1,50 @@ +#************************************************************************* +# +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# Copyright 2000, 2010 Oracle and/or its affiliates. +# +# OpenOffice.org - a multi-platform office productivity suite +# +# This file is part of OpenOffice.org. +# +# OpenOffice.org is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License version 3 +# only, as published by the Free Software Foundation. +# +# OpenOffice.org is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License version 3 for more details +# (a copy is included in the LICENSE file that accompanied this code). +# +# You should have received a copy of the GNU Lesser General Public License +# version 3 along with OpenOffice.org. If not, see +# <http://www.openoffice.org/license.html> +# for a copy of the LGPLv3 License. +# +#************************************************************************* + +.IF "$(OOO_SUBSEQUENT_TESTS)" == "" +nothing .PHONY: +.ELSE + +PRJ = ../../.. +PRJNAME = sw +TARGET = qa_complex_checkColor + +.IF "$(OOO_JUNIT_JAR)" != "" +PACKAGE = complex/checkColor +JAVATESTFILES = CheckChangeColor.java +JAVAFILES = $(JAVATESTFILES) +JARFILES = OOoRunner.jar ridl.jar test.jar unoil.jar +EXTRAJARFILES = $(OOO_JUNIT_JAR) +.END + +.INCLUDE: settings.mk +.INCLUDE: target.mk +.INCLUDE: installationtest.mk + +ALLTAR : javatest + +.END diff --git a/sw/qa/complex/writer/TestDocument.java b/sw/qa/complex/writer/TestDocument.java index 25a11338ae5c..088c9aede3d6 100644 --- a/sw/qa/complex/writer/TestDocument.java +++ b/sw/qa/complex/writer/TestDocument.java @@ -29,10 +29,11 @@ package complex.writer; import java.io.File; import org.openoffice.test.OfficeFileUrl; +import org.openoffice.test.Argument; final class TestDocument { public static String getUrl(String name) { - return OfficeFileUrl.getAbsolute(new File("testdocuments", name)); + return OfficeFileUrl.getAbsolute(new File(Argument.get("tdoc"), name)); } private TestDocument() {} diff --git a/sw/qa/unoapi/makefile.mk b/sw/qa/unoapi/makefile.mk new file mode 100644 index 000000000000..f5102c2c9c84 --- /dev/null +++ b/sw/qa/unoapi/makefile.mk @@ -0,0 +1,48 @@ +#************************************************************************* +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# Copyright 2000, 2010 Oracle and/or its affiliates. +# +# OpenOffice.org - a multi-platform office productivity suite +# +# This file is part of OpenOffice.org. +# +# OpenOffice.org is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License version 3 +# only, as published by the Free Software Foundation. +# +# OpenOffice.org is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License version 3 for more details +# (a copy is included in the LICENSE file that accompanied this code). +# +# You should have received a copy of the GNU Lesser General Public License +# version 3 along with OpenOffice.org. If not, see +# <http://www.openoffice.org/license.html> +# for a copy of the LGPLv3 License. +#***********************************************************************/ + +.IF "$(OOO_SUBSEQUENT_TESTS)" == "" +nothing .PHONY: +.ELSE + +PRJ = ../.. +PRJNAME = sw +TARGET = qa_unoapi + +.IF "$(OOO_JUNIT_JAR)" != "" +PACKAGE = org/openoffice/sw/qa/unoapi +JAVATESTFILES = Test.java +JAVAFILES = $(JAVATESTFILES) +JARFILES = OOoRunner.jar ridl.jar test.jar +EXTRAJARFILES = $(OOO_JUNIT_JAR) +.END + +.INCLUDE: settings.mk +.INCLUDE: target.mk +.INCLUDE: installationtest.mk + +ALLTAR : javatest + +.END diff --git a/sw/sdi/_docsh.sdi b/sw/sdi/_docsh.sdi index 1c5b0db4f062..ad37160a3c1f 100644 --- a/sw/sdi/_docsh.sdi +++ b/sw/sdi/_docsh.sdi @@ -121,17 +121,6 @@ interface BaseTextDocument StateMethod = GetState ; ] - SID_BROWSER_MODE - [ - ExecMethod = Execute; - StateMethod = GetState; - ] - - FN_PRINT_LAYOUT - [ - ExecMethod = Execute; - StateMethod = GetState; - ] SID_MAIL_PREPAREEXPORT [ ExecMethod = Execute ; diff --git a/sw/sdi/_viewsh.sdi b/sw/sdi/_viewsh.sdi index ee5fc431e165..a17fbb8f5742 100644 --- a/sw/sdi/_viewsh.sdi +++ b/sw/sdi/_viewsh.sdi @@ -98,6 +98,16 @@ interface BaseTextEditView ExecMethod = ExecDraw ; StateMethod = GetDrawState ; ] + SID_BROWSER_MODE + [ + ExecMethod = ExecViewOptions ; + StateMethod = StateViewOptions ; + ] + FN_PRINT_LAYOUT + [ + ExecMethod = ExecViewOptions ; + StateMethod = StateViewOptions ; + ] FN_REDLINE_PROTECT [ ExecMethod = Execute; diff --git a/sw/source/core/access/accdoc.cxx b/sw/source/core/access/accdoc.cxx index 7e13c561bc8b..bad6b1b4f5ab 100644 --- a/sw/source/core/access/accdoc.cxx +++ b/sw/source/core/access/accdoc.cxx @@ -65,10 +65,10 @@ using lang::IndexOutOfBoundsException; // SwAccessiblePreview // -SwAccessibleDocumentBase::SwAccessibleDocumentBase ( SwAccessibleMap* pInitMap ) : - SwAccessibleContext( pInitMap, AccessibleRole::DOCUMENT, - pInitMap->GetShell()->getIDocumentLayoutAccess()->GetRootFrm() ), - mxParent( pInitMap->GetShell()->GetWin()->GetAccessibleParentWindow()->GetAccessible() ), +SwAccessibleDocumentBase::SwAccessibleDocumentBase ( SwAccessibleMap *_pMap ) : + SwAccessibleContext( _pMap, AccessibleRole::DOCUMENT, + _pMap->GetShell()->GetLayout() ),//swmod 071107//swmod 071225 + mxParent( _pMap->GetShell()->GetWin()->GetAccessibleParentWindow()->GetAccessible() ), mpChildWin( 0 ) { } diff --git a/sw/source/core/access/accframebase.cxx b/sw/source/core/access/accframebase.cxx index 5ab12b068678..f96b050260b6 100644 --- a/sw/source/core/access/accframebase.cxx +++ b/sw/source/core/access/accframebase.cxx @@ -217,7 +217,7 @@ SwAccessibleFrameBase::~SwAccessibleFrameBase() { } -void SwAccessibleFrameBase::Modify( SfxPoolItem *pOld, SfxPoolItem *pNew) +void SwAccessibleFrameBase::Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew) { sal_uInt16 nWhich = pOld ? pOld->Which() : pNew ? pNew->Which() : 0 ; const SwFlyFrm *pFlyFrm = static_cast< const SwFlyFrm * >( GetFrm() ); @@ -231,13 +231,13 @@ void SwAccessibleFrameBase::Modify( SfxPoolItem *pOld, SfxPoolItem *pNew) OUString sOldName( GetName() ); OSL_ENSURE( !pOld || - static_cast < SwStringMsgPoolItem * >( pOld )->GetString() == String( sOldName ), + static_cast < const SwStringMsgPoolItem * >( pOld )->GetString() == String( sOldName ), "invalid old name" ); const String& rNewName = pFrmFmt->GetName(); SetName( rNewName ); OSL_ENSURE( !pNew || - static_cast < SwStringMsgPoolItem * >( pNew )->GetString() == rNewName, + static_cast < const SwStringMsgPoolItem * >( pNew )->GetString() == rNewName, "invalid new name" ); if( sOldName != GetName() ) @@ -251,18 +251,20 @@ void SwAccessibleFrameBase::Modify( SfxPoolItem *pOld, SfxPoolItem *pNew) } break; case RES_OBJECTDYING: + // mba: it seems that this class intentionally does not call code in base class SwClient if( GetRegisteredIn() == - static_cast< SwModify *>( static_cast< SwPtrMsgPoolItem * >( pOld )->pObject ) ) - pRegisteredIn->Remove( this ); + static_cast< SwModify *>( static_cast< const SwPtrMsgPoolItem * >( pOld )->pObject ) ) + GetRegisteredInNonConst()->Remove( this ); break; case RES_FMT_CHG: - if( static_cast< SwFmtChg * >(pNew)->pChangedFmt == GetRegisteredIn() && - static_cast< SwFmtChg * >(pOld)->pChangedFmt->IsFmtInDTOR() ) - pRegisteredIn->Remove( this ); + if( static_cast< const SwFmtChg * >(pNew)->pChangedFmt == GetRegisteredIn() && + static_cast< const SwFmtChg * >(pOld)->pChangedFmt->IsFmtInDTOR() ) + GetRegisteredInNonConst()->Remove( this ); break; + default: - SwClient::Modify( pOld, pNew ); + // mba: former call to base class method removed as it is meant to handle only RES_OBJECTDYING break; } } @@ -272,7 +274,7 @@ void SwAccessibleFrameBase::Dispose( sal_Bool bRecursive ) SolarMutexGuard aGuard; if( GetRegisteredIn() ) - pRegisteredIn->Remove( this ); + GetRegisteredInNonConst()->Remove( this ); SwAccessibleContext::Dispose( bRecursive ); } diff --git a/sw/source/core/access/accframebase.hxx b/sw/source/core/access/accframebase.hxx index 4f0b17d0898e..8ac7f2e2e0c6 100644 --- a/sw/source/core/access/accframebase.hxx +++ b/sw/source/core/access/accframebase.hxx @@ -52,6 +52,7 @@ protected: virtual void _InvalidateFocus(); virtual ~SwAccessibleFrameBase(); + virtual void Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew); public: @@ -61,8 +62,6 @@ public: virtual sal_Bool HasCursor(); // required by map to remember that object - virtual void Modify( SfxPoolItem *pOld, SfxPoolItem *pNew); - static sal_uInt8 GetNodeType( const SwFlyFrm *pFlyFrm ); // The object is not visible an longer and should be destroyed diff --git a/sw/source/core/access/accfrmobj.cxx b/sw/source/core/access/accfrmobj.cxx index 1e72847fbe3f..6b3f73c713b3 100644 --- a/sw/source/core/access/accfrmobj.cxx +++ b/sw/source/core/access/accfrmobj.cxx @@ -357,7 +357,7 @@ const SwFrm* SwAccessibleChild::GetParent( const sal_Bool bInPagePreview ) const if( bInPagePreview ) pParent = pFly->FindPageFrm(); else - pParent = pFly->FindRootFrm(); + pParent = pFly->getRootFrm(); } } else @@ -393,7 +393,7 @@ const SwFrm* SwAccessibleChild::GetParent( const sal_Bool bInPagePreview ) const if( bInPagePreview ) pParent = pContact->GetAnchorFrm()->FindPageFrm(); else - pParent = pContact->GetAnchorFrm()->FindRootFrm(); + pParent = pContact->GetAnchorFrm()->getRootFrm(); } } } diff --git a/sw/source/core/access/accmap.cxx b/sw/source/core/access/accmap.cxx index 91c2614deac0..a3294bc2aa01 100644 --- a/sw/source/core/access/accmap.cxx +++ b/sw/source/core/access/accmap.cxx @@ -74,6 +74,7 @@ #include <ndtxt.hxx> #include <dflyobj.hxx> #include <prevwpage.hxx> +#include <switerator.hxx> using namespace ::com::sun::star; using namespace ::com::sun::star::accessibility; @@ -2627,15 +2628,8 @@ SwAccessibleSelectedParas_Impl* SwAccessibleMap::_BuildSelectedParas() if ( pTxtNode ) { // loop on all text frames registered at the text node. - SwClientIter aIter( *pTxtNode ); - for( SwFrm* pFrm = (SwFrm*)aIter.First( TYPE(SwFrm) ); - pFrm; - pFrm = (SwFrm*)aIter.Next() ) - { - OSL_ENSURE( dynamic_cast<SwTxtFrm*>(pFrm), - "<SwAccessibleMap::_BuildSelectedParas()> - unexpected frame type" ); - SwTxtFrm* pTxtFrm( dynamic_cast<SwTxtFrm*>(pFrm) ); - if ( pTxtFrm ) + SwIterator<SwTxtFrm,SwTxtNode> aIter( *pTxtNode ); + for( SwTxtFrm* pTxtFrm = aIter.First(); pTxtFrm; pTxtFrm = aIter.Next() ) { uno::WeakReference < XAccessible > xWeakAcc; SwAccessibleContextMap_Impl::iterator aMapIter = @@ -2663,7 +2657,6 @@ SwAccessibleSelectedParas_Impl* SwAccessibleMap::_BuildSelectedParas() } } } - } // prepare next turn: get next cursor in ring pCrsr = static_cast<SwPaM*>( pCrsr->GetNext() ); diff --git a/sw/source/core/access/accnotextframe.cxx b/sw/source/core/access/accnotextframe.cxx index 86910db5aa07..6777b63f23a5 100644 --- a/sw/source/core/access/accnotextframe.cxx +++ b/sw/source/core/access/accnotextframe.cxx @@ -91,7 +91,7 @@ SwAccessibleNoTextFrame::~SwAccessibleNoTextFrame() { } -void SwAccessibleNoTextFrame::Modify( SfxPoolItem *pOld, SfxPoolItem *pNew) +void SwAccessibleNoTextFrame::Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew) { const sal_uInt16 nWhich = pOld ? pOld->Which() : pNew ? pNew->Which() : 0 ; // #i73249# @@ -111,9 +111,9 @@ void SwAccessibleNoTextFrame::Modify( SfxPoolItem *pOld, SfxPoolItem *pNew) case RES_TITLE_CHANGED: { const String& sOldTitle( - dynamic_cast<SwStringMsgPoolItem*>(pOld)->GetString() ); + dynamic_cast<const SwStringMsgPoolItem*>(pOld)->GetString() ); const String& sNewTitle( - dynamic_cast<SwStringMsgPoolItem*>(pNew)->GetString() ); + dynamic_cast<const SwStringMsgPoolItem*>(pNew)->GetString() ); if ( sOldTitle == sNewTitle ) { break; diff --git a/sw/source/core/access/accnotextframe.hxx b/sw/source/core/access/accnotextframe.hxx index f5e3e536d11a..ce4ef672c110 100644 --- a/sw/source/core/access/accnotextframe.hxx +++ b/sw/source/core/access/accnotextframe.hxx @@ -46,14 +46,14 @@ protected: const SwNoTxtNode *GetNoTxtNode() const; + virtual void Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew); + public: SwAccessibleNoTextFrame( SwAccessibleMap* pInitMap, sal_Int16 nInitRole, const SwFlyFrm *pFlyFrm ); - virtual void Modify( SfxPoolItem *pOld, SfxPoolItem *pNew); - //===== XAccessibleContext ============================================== // #i73249# - Return the object's current name. diff --git a/sw/source/core/access/accpara.cxx b/sw/source/core/access/accpara.cxx index 87a59379fb38..f515494d234d 100644 --- a/sw/source/core/access/accpara.cxx +++ b/sw/source/core/access/accpara.cxx @@ -2601,11 +2601,11 @@ sal_Int32 SAL_CALL SwAccessibleParagraph::getNumberOfLineWithCaret() } // #i108125# -void SwAccessibleParagraph::Modify( SfxPoolItem* pOld, SfxPoolItem* pNew ) +void SwAccessibleParagraph::Modify( const SfxPoolItem* pOld, const SfxPoolItem* pNew ) { mpParaChangeTrackInfo->reset(); - SwClient::Modify( pOld, pNew ); + CheckRegistration( pOld, pNew ); } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/source/core/access/accpara.hxx b/sw/source/core/access/accpara.hxx index 062af1aa8940..d3092e2326f3 100644 --- a/sw/source/core/access/accpara.hxx +++ b/sw/source/core/access/accpara.hxx @@ -226,6 +226,8 @@ protected: ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException); + virtual void Modify( const SfxPoolItem* pOld, const SfxPoolItem* pNew); + public: SwAccessibleParagraph( SwAccessibleMap& rInitMap, @@ -235,8 +237,6 @@ public: virtual sal_Bool HasCursor(); // required by map to remember that object - virtual void Modify( SfxPoolItem* pOld, SfxPoolItem* pNew); // #i108125# - //===== XAccessibleContext ============================================== /// Return this object's description. diff --git a/sw/source/core/access/acctable.cxx b/sw/source/core/access/acctable.cxx index 563a000a3230..ba843fb22715 100644 --- a/sw/source/core/access/acctable.cxx +++ b/sw/source/core/access/acctable.cxx @@ -732,7 +732,7 @@ SwAccessibleTable::~SwAccessibleTable() delete mpTableData; } -void SwAccessibleTable::Modify( SfxPoolItem *pOld, SfxPoolItem *pNew) +void SwAccessibleTable::Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew) { sal_uInt16 nWhich = pOld ? pOld->Which() : pNew ? pNew->Which() : 0 ; const SwTabFrm *pTabFrm = static_cast< const SwTabFrm * >( GetFrm() ); @@ -779,13 +779,14 @@ void SwAccessibleTable::Modify( SfxPoolItem *pOld, SfxPoolItem *pNew) break; case RES_OBJECTDYING: + // mba: it seems that this class intentionally does not call code in base class SwClient if( GetRegisteredIn() == - static_cast< SwModify *>( static_cast< SwPtrMsgPoolItem * >( pOld )->pObject ) ) - pRegisteredIn->Remove( this ); + static_cast< SwModify *>( static_cast< const SwPtrMsgPoolItem * >( pOld )->pObject ) ) + GetRegisteredInNonConst()->Remove( this ); break; default: - SwClient::Modify( pOld, pNew ); + // mba: former call to base class method removed as it is meant to handle only RES_OBJECTDYING break; } } @@ -1350,7 +1351,7 @@ void SwAccessibleTable::Dispose( sal_Bool bRecursive ) SolarMutexGuard aGuard; if( GetRegisteredIn() ) - pRegisteredIn->Remove( this ); + GetRegisteredInNonConst()->Remove( this ); SwAccessibleContext::Dispose( bRecursive ); } @@ -1666,7 +1667,7 @@ SwAccessibleTableData_Impl* SwAccessibleTableColHeaders::CreateNewTableData() } -void SwAccessibleTableColHeaders::Modify( SfxPoolItem * /*pOld*/, SfxPoolItem * /*pNew*/ ) +void SwAccessibleTableColHeaders::Modify( const SfxPoolItem * /*pOld*/, const SfxPoolItem * /*pNew*/ ) { } diff --git a/sw/source/core/access/acctable.hxx b/sw/source/core/access/acctable.hxx index 04fe465a91a6..491ba5c4416d 100644 --- a/sw/source/core/access/acctable.hxx +++ b/sw/source/core/access/acctable.hxx @@ -88,12 +88,12 @@ protected: // Is table data evailable? sal_Bool HasTableData() const { return (mpTableData != 0); } + virtual void Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew); + public: SwAccessibleTable( SwAccessibleMap* pInitMap, const SwTabFrm* pTableFrm ); - virtual void Modify( SfxPoolItem *pOld, SfxPoolItem *pNew); - //===== XInterface ====================================================== // (XInterface methods need to be implemented to disambigouate @@ -275,13 +275,12 @@ protected: {} virtual SwAccessibleTableData_Impl* CreateNewTableData(); + virtual void Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew); public: SwAccessibleTableColHeaders( SwAccessibleMap *pMap, const SwTabFrm *pTabFrm ); - virtual void Modify( SfxPoolItem *pOld, SfxPoolItem *pNew); - //===== XInterface ====================================================== virtual ::com::sun::star::uno::Any SAL_CALL queryInterface( diff --git a/sw/source/core/access/acctextframe.cxx b/sw/source/core/access/acctextframe.cxx index d86e3e3a8173..6d41322a7703 100644 --- a/sw/source/core/access/acctextframe.cxx +++ b/sw/source/core/access/acctextframe.cxx @@ -83,7 +83,7 @@ SwAccessibleTextFrame::~SwAccessibleTextFrame() { } -void SwAccessibleTextFrame::Modify( SfxPoolItem *pOld, SfxPoolItem *pNew) +void SwAccessibleTextFrame::Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew) { const sal_uInt16 nWhich = pOld ? pOld->Which() : pNew ? pNew->Which() : 0 ; // #i73249# - suppress handling of RES_NAME_CHANGED @@ -101,9 +101,9 @@ void SwAccessibleTextFrame::Modify( SfxPoolItem *pOld, SfxPoolItem *pNew) case RES_TITLE_CHANGED: { const String& sOldTitle( - dynamic_cast<SwStringMsgPoolItem*>(pOld)->GetString() ); + dynamic_cast<const SwStringMsgPoolItem*>(pOld)->GetString() ); const String& sNewTitle( - dynamic_cast<SwStringMsgPoolItem*>(pNew)->GetString() ); + dynamic_cast<const SwStringMsgPoolItem*>(pNew)->GetString() ); if ( sOldTitle == sNewTitle ) { break; diff --git a/sw/source/core/access/acctextframe.hxx b/sw/source/core/access/acctextframe.hxx index f9b90fe50d19..92c029d69e23 100644 --- a/sw/source/core/access/acctextframe.hxx +++ b/sw/source/core/access/acctextframe.hxx @@ -47,13 +47,12 @@ protected: virtual ~SwAccessibleTextFrame(); + virtual void Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew); + public: SwAccessibleTextFrame( SwAccessibleMap* pInitMap, const SwFlyFrm* pFlyFrm ); - virtual void Modify( SfxPoolItem *pOld, SfxPoolItem *pNew); - - //===== XAccessibleContext ============================================== // #i73249# - Return the object's current name. diff --git a/sw/source/core/attr/calbck.cxx b/sw/source/core/attr/calbck.cxx index dc6c6d6dcecd..844bd0dfbbd2 100644 --- a/sw/source/core/attr/calbck.cxx +++ b/sw/source/core/attr/calbck.cxx @@ -29,117 +29,102 @@ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_sw.hxx" - -#include <hintids.hxx> // fuer RES_.. +#include <hintids.hxx> // contains RES_.. IDs #include <frame.hxx> #include <hints.hxx> -#include <swcache.hxx> -#include <swfntcch.hxx> - -#if OSL_DEBUG_LEVEL > 1 -#include <unotextmarkup.hxx> -#endif +#include <swcache.hxx> // mba: get rid of that dependency +#include <swfntcch.hxx> // mba: get rid of that dependency static SwClientIter* pClientIters = 0; -TYPEINIT0(SwClient); //rtti - -/************************************************************************* -|* SwClient::SwClient(SwModify *) -|* -|* Beschreibung callback.doc V1.14 -*************************************************************************/ - +TYPEINIT0(SwClient); +/*************************************************************************/ SwClient::SwClient(SwModify *pToRegisterIn) - : pLeft( 0 ), pRight( 0 ), pRegisteredIn( 0 ) + : pLeft( 0 ), pRight( 0 ), pRegisteredIn( 0 ), mbIsAllowedToBeRemovedInModifyCall(false) { - bModifyLocked = - bInModify = - bInDocDTOR = - bInCache = sal_False; - bInSwFntCache = sal_False; - if(pToRegisterIn) + // connect to SwModify pToRegisterIn->Add(this); } -/************************************************************************* -|* SwClient::Modify() -|* -|* Beschreibung callback.doc V1.14 -*************************************************************************/ - - -void SwClient::Modify( SfxPoolItem *pOld, SfxPoolItem * ) +/*************************************************************************/ +void SwClient::CheckRegistration( const SfxPoolItem* pOld, const SfxPoolItem * ) { + // this method only handles notification about dying SwModify objects if( (!pOld || pOld->Which() != RES_OBJECTDYING) ) return; - SwPtrMsgPoolItem *pDead = (SwPtrMsgPoolItem *)pOld; - if(pDead->pObject == pRegisteredIn) + const SwPtrMsgPoolItem *pDead = static_cast<const SwPtrMsgPoolItem*>(pOld); + if(pDead && pDead->pObject == pRegisteredIn) { - SwModify *pAbove = (SwModify*)pRegisteredIn->GetRegisteredIn(); + // I've got a notification from the object I know + SwModify *pAbove = const_cast<SwModify*>(pRegisteredIn->GetRegisteredIn()); if(pAbove) { + // if the dying object itself was listening at an SwModify, I take over + // adding myself to pAbove will automatically remove me from my current pRegisteredIn pAbove->Add(this); return; } + + // destroy connection pRegisteredIn->Remove(this); } } -/************************************************************************* -|* SwClient::~SwClient() -|* -|* Beschreibung callback.doc V1.14 -*************************************************************************/ +void SwClient::Modify( const SfxPoolItem *pOldValue, const SfxPoolItem *pNewValue ) +{ + CheckRegistration( pOldValue, pNewValue ); +} +void SwClient::SwClientNotify( const SwModify&, const SfxHint& ) +{ + +} +//************************************************************************* SwClient::~SwClient() { + DBG_ASSERT( !pRegisteredIn || pRegisteredIn->GetDepends(),"SwModify still known, but Client already disconnected!" ); if( pRegisteredIn && pRegisteredIn->GetDepends() ) + // still connected pRegisteredIn->Remove( this ); - - OSL_ENSURE( !IsModifyLocked(), "Modify destroyed but locked." ); } - // erfrage vom Client Informationen sal_Bool SwClient::GetInfo( SfxPoolItem& ) const { return sal_True; // und weiter } -/************************************************************************* -|* SwModify::SwModify( SwModify * ) -|* -|* Beschreibung Dokument 1.7 -*************************************************************************/ - -SwModify::SwModify( SwModify *pToRegisterIn ) - : SwClient(pToRegisterIn), pRoot( 0 ) +/*************************************************************************/ +SwModify::SwModify() + : SwClient(0), pRoot(0) { + bModifyLocked = sal_False; + bLockClientList = sal_False; + bInDocDTOR = sal_False; + bInCache = sal_False; + bInSwFntCache = sal_False; } -// @@@ forbidden and not implemented, but needs to be accessible (protected). -SwModify::SwModify( const SwModify & ) - : SwClient( 0 ) +SwModify::SwModify( SwModify *pToRegisterIn ) + : SwClient(pToRegisterIn), pRoot( 0 ) { - OSL_PRECOND(0, "SwModify(const SwModify&): not implemented."); + bModifyLocked = sal_False; + bLockClientList = sal_False; + bInDocDTOR = sal_False; + bInCache = sal_False; + bInSwFntCache = sal_False; } -/************************************************************************* -|* SwModify::~SwModify() -|* -|* Beschreibung Dokument 1.7 -*************************************************************************/ - - - +/*************************************************************************/ SwModify::~SwModify() { + OSL_ENSURE( !IsModifyLocked(), "Modify destroyed but locked." ); + if ( IsInCache() ) SwFrm::GetCache().Delete( this ); @@ -148,42 +133,40 @@ SwModify::~SwModify() if( pRoot ) { + // there are depending objects if( IsInDocDTOR() ) { - // alle Clients "logisch" austragen + // if document gets destroyed anyway, just tell clients to forget me + // so that they don't try to get removed from my list later when they also get destroyed SwClientIter aIter( *this ); - SwClient* p; - while( 0 != ( p = aIter++ ) ) - p->pRegisteredIn = 0; - - p = aIter.GoRoot(); // wieder ab Root (==Start) anfangen - do { + SwClient* p = aIter.GoStart(); + while ( p ) + { p->pRegisteredIn = 0; - } while( 0 != ( p = aIter-- ) ); + p = aIter++; + } } else { - // verschicke die Nachricht an die abgeleiteten Objekte. + // notify all clients that they shall remove themselves SwPtrMsgPoolItem aDyObject( RES_OBJECTDYING, this ); - Modify( &aDyObject, &aDyObject ); + NotifyClients( &aDyObject, &aDyObject ); - // Zwangsummeldung aller derjenigen, die sich nicht ausgetragen - // haben, durch Aufruf von SwClient::Modify() + // remove all clients that have not done themselves + // mba: possibly a hotfix for forgotten base class calls?! while( pRoot ) - pRoot->SwClient::Modify(&aDyObject, &aDyObject); + pRoot->CheckRegistration(&aDyObject, &aDyObject); } } } -/************************************************************************* -|* SwModify::Modify( SwHint * pOldValue, SwHint * pNewValue ) -|* -|* Beschreibung Dokument 1.7 -*************************************************************************/ - - +/*************************************************************************/ +void SwModify::Modify( const SfxPoolItem *pOldValue, const SfxPoolItem *pNewValue ) +{ + NotifyClients( pOldValue, pNewValue ); +} -void SwModify::Modify( SfxPoolItem* pOldValue, SfxPoolItem* pNewValue ) +void SwModify::NotifyClients( const SfxPoolItem *pOldValue, const SfxPoolItem *pNewValue ) { if (IsInCache() || IsInSwFntCache()) { @@ -197,47 +180,35 @@ void SwModify::Modify( SfxPoolItem* pOldValue, SfxPoolItem* pNewValue ) LockModify(); -#if OSL_DEBUG_LEVEL > 1 + // mba: WTF?! if( !pOldValue ) - bInModify = sal_True; + bLockClientList = sal_True; else - // following Modifies don't calls an ASSRT + { + // following Modifies shouldn't call an ASSERT switch( pOldValue->Which() ) { case RES_OBJECTDYING: - case RES_REMOVE_UNO_OBJECT: - bInModify = ((SwPtrMsgPoolItem *)pOldValue)->pObject != this; + case RES_REMOVE_UNO_OBJECT: + bLockClientList = ((SwPtrMsgPoolItem *)pOldValue)->pObject != this; break; case RES_FOOTNOTE_DELETED: case RES_REFMARK_DELETED: case RES_TOXMARK_DELETED: case RES_FIELD_DELETED: - bInModify = sal_False; + bLockClientList = sal_False; break; default: - bInModify = sal_True; + bLockClientList = sal_True; } -#else - bInModify = sal_True; -#endif - - SwClientIter aIter( *this ); - SwClient * pLast = aIter.GoStart(); - if( pLast ) // konnte zum Anfang gesprungen werden ?? - do - { - pLast->Modify( pOldValue, pNewValue ); - if( !pRoot ) // Baum schon Weg ?? - break; - } while( 0 != ( pLast = aIter++ )); + } - bInModify = sal_False; + ModifyBroadcast( pOldValue, pNewValue ); + bLockClientList = sal_False; UnlockModify(); } -// erfrage vom Modify Informationen - sal_Bool SwModify::GetInfo( SfxPoolItem& rInfo ) const { sal_Bool bRet = sal_True; // bedeutet weiter zum naechsten @@ -253,46 +224,38 @@ sal_Bool SwModify::GetInfo( SfxPoolItem& rInfo ) const ; } - return bRet; // und weiter + return bRet; } -/************************************************************************* -|* SwModify::Add( SwClient *pDepend ) -|* -|* Beschreibung Dokument 1.7 -*************************************************************************/ - - - +/*************************************************************************/ void SwModify::Add(SwClient *pDepend) { - OSL_ENSURE( !bInModify, "Client innerhalb des eigenen Modifies einfuegen?" ); + OSL_ENSURE( !bLockClientList, "Client inserted while in Modify" ); - // nur wenn das hier noch nicht eingetragen ist einfuegen if(pDepend->pRegisteredIn != this ) { #if OSL_DEBUG_LEVEL > 1 SwClientIter* pTmp = pClientIters; while( pTmp ) { - OSL_ENSURE( &pTmp->rRoot != pRoot, - "Client beim angemeldeten ClientIter einfuegen?" ); + OSL_ENSURE( &pTmp->GetModify() != pRoot, "Client added to active ClientIter" ); pTmp = pTmp->pNxtIter; } #endif - // wenn schon wanders angemeldet, dann dort abmelden + // deregister new client in case it is already registered elsewhere if( pDepend->pRegisteredIn != 0 ) pDepend->pRegisteredIn->Remove( pDepend ); if( !pRoot ) { + // first client added pRoot = pDepend; pRoot->pLeft = 0; pRoot->pRight = 0; } else { - // immer hinter die Root haengen + // append client pDepend->pRight = pRoot->pRight; pRoot->pRight = pDepend; pDepend->pLeft = pRoot; @@ -300,29 +263,24 @@ void SwModify::Add(SwClient *pDepend) pDepend->pRight->pLeft = pDepend; } + // connect client to me pDepend->pRegisteredIn = this; } } -/************************************************************************* -|* SwModify::_Remove( SwClient *pDepend ) -|* -|* Beschreibung Dokument 1.7 -*************************************************************************/ - +/*************************************************************************/ - -SwClient *SwModify::_Remove(SwClient * pDepend) +SwClient* SwModify::Remove(SwClient * pDepend) { - // FME 2007-07-16 #i79641# SwXTextMarkup is allowed to be removed ... -#if OSL_DEBUG_LEVEL > 1 - OSL_ENSURE( !bInModify || 0 != dynamic_cast<SwXTextMarkup*>(pDepend), "Client innerhalb des eigenen Modifies loeschen?" ); -#endif + if ( bInDocDTOR ) + return 0; + + OSL_ENSURE( !bLockClientList || pDepend->mbIsAllowedToBeRemovedInModifyCall, "SwClient shall be removed in Modify call!" ); - // loesche das Object aus der Liste und setze den - // Registrierungs-Pointer zurueck if( pDepend->pRegisteredIn == this ) { + // SwClient is my listener + // remove it from my list SwClient* pR = pDepend->pRight; SwClient* pL = pDepend->pLeft; if( pRoot == pDepend ) @@ -333,36 +291,41 @@ SwClient *SwModify::_Remove(SwClient * pDepend) if( pR ) pR->pLeft = pL; - // alle Client-Iters updaten + // update ClientIters SwClientIter* pTmp = pClientIters; while( pTmp ) { - if( pTmp->pAkt == pDepend || pTmp->pDelNext == pDepend ) + if( pTmp->pAct == pDepend || pTmp->pDelNext == pDepend ) + // if object being removed is the current or next object in an iterator, advance this iterator pTmp->pDelNext = pR; - - // Notify SwClientIter if mpWatchClient is removed - if ( pTmp->mpWatchClient == pDepend ) - pTmp->mpWatchClient = 0; - pTmp = pTmp->pNxtIter; } pDepend->pLeft = 0; pDepend->pRight = 0; } - else { - OSL_FAIL( "SwModify::Remove(): pDepend nicht gefunden"); + else + { + OSL_FAIL( "SwModify::Remove(): pDepend nicht gefunden" ); } + + // disconnect client from me pDepend->pRegisteredIn = 0; return pDepend; } - -/************************************************************************* -|* SwModify::CheckCaching( const sal_uInt16 nWhich ) -*************************************************************************/ - - +int SwModify::GetClientCount() const +{ + int nRet=0; + SwClientIter aIter( *this ); + SwClient *pLast = aIter.GoStart(); + if( pLast ) + do + { + ++nRet; + } while( 0 != ( pLast = aIter++ )); + return nRet; +} void SwModify::CheckCaching( const sal_uInt16 nWhich ) { @@ -394,17 +357,33 @@ void SwModify::CheckCaching( const sal_uInt16 nWhich ) } } +void SwModify::CallSwClientNotify( const SfxHint& rHint ) const +{ + SwClientIter aIter(*this); + SwClient * pClient = aIter.GoStart(); + while (pClient) + { + pClient->SwClientNotify( *this, rHint ); + pClient = aIter++; + } +} + +void SwModify::ModifyBroadcast( const SfxPoolItem *pOldValue, const SfxPoolItem *pNewValue, TypeId nType ) +{ + SwClientIter aIter(*this); + SwClient * pClient = aIter.First( nType ); + while (pClient) + { + pClient->Modify( pOldValue, pNewValue ); + pClient = aIter.Next(); + } +} // ---------- // SwDepend // ---------- -/************************************************************************* -|* SwDepend::SwDepend(SwClient *pTellHim,SwModify *pDepend) -|* -|* Beschreibung callback.doc V1.14 -*************************************************************************/ - +/*************************************************************************/ SwDepend::SwDepend(SwClient *pTellHim, SwModify *pDepend) : SwClient(pDepend) @@ -412,25 +391,22 @@ SwDepend::SwDepend(SwClient *pTellHim, SwModify *pDepend) pToTell = pTellHim; } -/************************************************************************* -|* -|* SwDepend::Modify(SwHint *, SwHint *) -|* -|* Beschreibung callback.doc V1.14 -|* -*************************************************************************/ - +/*************************************************************************/ -void SwDepend::Modify( SfxPoolItem *pOldValue, SfxPoolItem *pNewValue ) +void SwDepend::Modify( const SfxPoolItem* pOldValue, const SfxPoolItem *pNewValue ) { if(pNewValue && pNewValue->Which() == RES_OBJECTDYING) - SwClient::Modify(pOldValue,pNewValue); + CheckRegistration(pOldValue,pNewValue); else if(pToTell) - pToTell->Modify(pOldValue, pNewValue); + pToTell->ModifyNotification(pOldValue, pNewValue); } +void SwDepend::SwClientNotify( const SwModify& rMod, const SfxHint& rHint ) +{ + if ( pToTell ) + pToTell->SwClientNotifyCall( rMod, rHint ); +} - // erfrage vom Modify Informationen sal_Bool SwDepend::GetInfo( SfxPoolItem& rInfo ) const { return pToTell ? pToTell->GetInfo( rInfo ) : sal_True; @@ -438,14 +414,13 @@ sal_Bool SwDepend::GetInfo( SfxPoolItem& rInfo ) const /********************************************************************/ - -SwClientIter::SwClientIter( SwModify const& rModify ) +SwClientIter::SwClientIter( const SwModify& rModify ) : rRoot( rModify ) { - // hinten einketten! pNxtIter = 0; if( pClientIters ) { + // append to list of ClientIters SwClientIter* pTmp = pClientIters; while( pTmp->pNxtIter ) pTmp = pTmp->pNxtIter; @@ -454,9 +429,8 @@ SwClientIter::SwClientIter( SwModify const& rModify ) else pClientIters = this; - pAkt = rRoot.pRoot; - pDelNext = pAkt; - mpWatchClient = 0; + pAct = const_cast<SwClient*>(rRoot.GetDepends()); + pDelNext = pAct; } @@ -465,6 +439,7 @@ SwClientIter::~SwClientIter() { if( pClientIters ) { + // reorganize list of ClientIters if( pClientIters == this ) pClientIters = pNxtIter; else @@ -482,126 +457,111 @@ SwClientIter::~SwClientIter() } - // Postfix Operator SwClient* SwClientIter::operator++(int) { - if( pDelNext == pAkt ) - { - pAkt = pAkt->pRight; - pDelNext = pAkt; - } - else - pAkt = pDelNext; - return pAkt; -} - - - // Prefix Operator -SwClient* SwClientIter::operator++() -{ - if( pDelNext == pAkt ) + if( pDelNext == pAct ) { - pAkt = pAkt->pRight; - pDelNext = pAkt; + pAct = pAct->pRight; + pDelNext = pAct; } else - pAkt = pDelNext; - return pAkt; + pAct = pDelNext; + return pAct; } - - // Postfix Operator -SwClient* SwClientIter::operator--(int) +SwClient* SwClientIter::GoStart() { -// solange der CFRONT Prefix und PostFix nicht unterscheiden kann, immer -// als Prefix-Operator arbeiten. Wenn der CFRONT es kann, muss auch der -// Code entsprechen umgestellt werden !!! - if( pDelNext == pAkt ) - pAkt = pAkt->pLeft; - else - pAkt = pDelNext->pLeft; - pDelNext = pAkt; - return pAkt; + pAct = const_cast<SwClient*>(rRoot.GetDepends()); + if( pAct ) + while( pAct->pLeft ) + pAct = pAct->pLeft; + pDelNext = pAct; + return pAct; } - - // Prefix Operator -SwClient* SwClientIter::operator--() +SwClient* SwClientIter::GoEnd() { - if( pDelNext == pAkt ) - pAkt = pAkt->pLeft; - else - pAkt = pDelNext->pLeft; - pDelNext = pAkt; - return pAkt; + pAct = pDelNext; + if( !pAct ) + pAct = const_cast<SwClient*>(rRoot.GetDepends()); + if( pAct ) + while( pAct->pRight ) + pAct = pAct->pRight; + pDelNext = pAct; + return pAct; } - -SwClient* SwClientIter::GoStart() // zum Anfang des Baums -{ - pAkt = rRoot.pRoot; - if( pAkt ) - while( pAkt->pLeft ) - pAkt = pAkt->pLeft; - pDelNext = pAkt; - return pAkt; -} - - -SwClient* SwClientIter::GoEnd() // zum End des Baums -{ - pAkt = pDelNext; - if( !pAkt ) - pAkt = rRoot.pRoot; - if( pAkt ) - while( pAkt->pRight ) - pAkt = pAkt->pRight; - pDelNext = pAkt; - return pAkt; -} - - - SwClient* SwClientIter::First( TypeId nType ) { aSrchId = nType; GoStart(); - if( pAkt ) + if( pAct ) do { - if( pAkt->IsA( aSrchId ) ) + if( pAct->IsA( aSrchId ) ) break; - if( pDelNext == pAkt ) + if( pDelNext == pAct ) { - pAkt = pAkt->pRight; - pDelNext = pAkt; + pAct = pAct->pRight; + pDelNext = pAct; } else - pAkt = pDelNext; + pAct = pDelNext; - } while( pAkt ); - return pAkt; + } while( pAct ); + return pAct; } - SwClient* SwClientIter::Next() { do { - // erstmal zum naechsten - if( pDelNext == pAkt ) + if( pDelNext == pAct ) { - pAkt = pAkt->pRight; - pDelNext = pAkt; + pAct = pAct->pRight; + pDelNext = pAct; } else - pAkt = pDelNext; + pAct = pDelNext; - if( pAkt && pAkt->IsA( aSrchId ) ) + if( pAct && pAct->IsA( aSrchId ) ) break; - } while( pAkt ); - return pAkt; + } while( pAct ); + return pAct; } +SwClient* SwClientIter::Last( TypeId nType ) +{ + aSrchId = nType; + GoEnd(); + if( pAct ) + do { + if( pAct->IsA( aSrchId ) ) + break; + + if( pDelNext == pAct ) + pAct = pAct->pLeft; + else + pAct = pDelNext->pLeft; + pDelNext = pAct; + + } while( pAct ); + return pAct; +} + +SwClient* SwClientIter::Previous() +{ + do { + if( pDelNext == pAct ) + pAct = pAct->pLeft; + else + pAct = pDelNext->pLeft; + pDelNext = pAct; + + if( pAct && pAct->IsA( aSrchId ) ) + break; + } while( pAct ); + return pAct; +} /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/source/core/attr/cellatr.cxx b/sw/source/core/attr/cellatr.cxx index aae83558ca47..abd2dfd887d1 100644 --- a/sw/source/core/attr/cellatr.cxx +++ b/sw/source/core/attr/cellatr.cxx @@ -30,9 +30,7 @@ #include "precompiled_sw.hxx" #include <float.h> - #include <rtl/math.hxx> - #include <hintids.hxx> // fuer RES_.. #include <cellatr.hxx> #include <calc.hxx> @@ -42,7 +40,7 @@ #include <node.hxx> #include <hints.hxx> #include <rolbck.hxx> - +#include <switerator.hxx> //TYPEINIT1( SwFmt, SwClient ); //rtti fuer SwFmt @@ -113,9 +111,9 @@ const SwNode* SwTblBoxFormula::GetNodeOfFormula() const const SwNode* pRet = 0; if( pDefinedIn ) { - SwClient* pBox = SwClientIter( *pDefinedIn ).First( TYPE( SwTableBox )); + SwTableBox* pBox = SwIterator<SwTableBox,SwModify>::FirstElement( *pDefinedIn ); if( pBox ) - pRet = ((SwTableBox*)pBox)->GetSttNd(); + pRet = pBox->GetSttNd(); } return pRet; } @@ -125,8 +123,7 @@ SwTableBox* SwTblBoxFormula::GetTableBox() { SwTableBox* pBox = 0; if( pDefinedIn ) - pBox = (SwTableBox*)SwClientIter( *pDefinedIn ). - First( TYPE( SwTableBox )); + pBox = SwIterator<SwTableBox,SwModify>::FirstElement( *pDefinedIn ); return pBox; } diff --git a/sw/source/core/attr/format.cxx b/sw/source/core/attr/format.cxx index d4b217e49d11..d15daee10f9a 100644 --- a/sw/source/core/attr/format.cxx +++ b/sw/source/core/attr/format.cxx @@ -139,16 +139,16 @@ SwFmt &SwFmt::operator=(const SwFmt& rFmt) { SwAttrSetChg aChgOld( aSet, aOld ); SwAttrSetChg aChgNew( aSet, aNew ); - Modify( &aChgOld, &aChgNew ); // alle veraenderten werden verschickt + ModifyNotification( &aChgOld, &aChgNew ); // alle veraenderten werden verschickt } - if( pRegisteredIn != rFmt.pRegisteredIn ) + if( GetRegisteredIn() != rFmt.GetRegisteredIn() ) { - if( pRegisteredIn ) - pRegisteredIn->Remove(this); - if(rFmt.pRegisteredIn) + if( GetRegisteredIn() ) + GetRegisteredInNonConst()->Remove(this); + if(rFmt.GetRegisteredIn()) { - rFmt.pRegisteredIn->Add(this); + const_cast<SwFmt&>(rFmt).GetRegisteredInNonConst()->Add(this); aSet.SetParent( &rFmt.aSet ); } else @@ -167,7 +167,7 @@ void SwFmt::SetName( const String& rNewName, sal_Bool bBroadcast ) SwStringMsgPoolItem aOld( RES_NAME_CHANGED, aFmtName ); SwStringMsgPoolItem aNew( RES_NAME_CHANGED, rNewName ); aFmtName = rNewName; - Modify( &aOld, &aNew ); + ModifyNotification( &aOld, &aNew ); } else { @@ -226,7 +226,7 @@ void SwFmt::CopyAttrs( const SwFmt& rFmt, sal_Bool bReplace ) SwAttrSetChg aChgOld( aSet, aOld ); SwAttrSetChg aChgNew( aSet, aNew ); - Modify( &aChgOld, &aChgNew ); // alle veraenderten werden verschickt + ModifyNotification( &aChgOld, &aChgNew ); // alle veraenderten werden verschickt } } @@ -264,7 +264,7 @@ SwFmt::~SwFmt() SwFmtChg aNewFmt(pParentFmt); SwClient * pDepend = (SwClient*)GetDepends(); pParentFmt->Add(pDepend); - pDepend->Modify(&aOldFmt, &aNewFmt); + pDepend->ModifyNotification(&aOldFmt, &aNewFmt); } } } @@ -272,13 +272,13 @@ SwFmt::~SwFmt() /************************************************************************* -|* void SwFmt::Modify( SfxPoolItem* pOldValue, SfxPoolItem* pNewValue ) +|* void SwFmt::Modify( const SfxPoolItem* pOldValue, const SfxPoolItem* pNewValue ) |* |* Beschreibung Dokument 1.14 *************************************************************************/ -void SwFmt::Modify( SfxPoolItem* pOldValue, SfxPoolItem* pNewValue ) +void SwFmt::Modify( const SfxPoolItem* pOldValue, const SfxPoolItem* pNewValue ) { sal_Bool bWeiter = sal_True; // sal_True = Propagierung an die Abhaengigen @@ -295,9 +295,9 @@ void SwFmt::Modify( SfxPoolItem* pOldValue, SfxPoolItem* pNewValue ) SwFmt * pFmt = (SwFmt *) ((SwPtrMsgPoolItem *)pNewValue)->pObject; // nicht umhaengen wenn dieses das oberste Format ist !! - if( pRegisteredIn && pRegisteredIn == pFmt ) + if( GetRegisteredIn() && GetRegisteredIn() == pFmt ) { - if( pFmt->pRegisteredIn ) + if( pFmt->GetRegisteredIn() ) { // wenn Parent, dann im neuen Parent wieder anmelden pFmt->DerivedFrom()->Add( this ); @@ -325,7 +325,7 @@ void SwFmt::Modify( SfxPoolItem* pOldValue, SfxPoolItem* pNewValue ) if( aNew.Count() ) // keine mehr gesetzt, dann Ende !! - SwModify::Modify( &aOld, &aNew ); + NotifyClients( &aOld, &aNew ); bWeiter = sal_False; } break; @@ -346,12 +346,12 @@ void SwFmt::Modify( SfxPoolItem* pOldValue, SfxPoolItem* pNewValue ) { // IsWritten-Flag zuruecksetzen. Hint nur an abhanegige // Formate (und keine Frames) propagieren. + // mba: the code does the opposite from what is written in the comment! ResetWritten(); - SwClientIter aIter( *this ); - for( SwClient *pClient = aIter.First( TYPE(SwFmt) ); pClient; - pClient = aIter.Next() ) - pClient->Modify( pOldValue, pNewValue ); - + // mba: here we don't use the additional stuff from NotifyClients(). + // should we?! + // mba: move the code that ignores this event to the clients + ModifyBroadcast( pOldValue, pNewValue, TYPE(SwFmt) ); bWeiter = sal_False; } break; @@ -376,7 +376,7 @@ void SwFmt::Modify( SfxPoolItem* pOldValue, SfxPoolItem* pNewValue ) if( bWeiter ) { // laufe durch alle abhaengigen Formate - SwModify::Modify( pOldValue, pNewValue ); + NotifyClients( pOldValue, pNewValue ); } } @@ -424,7 +424,7 @@ sal_Bool SwFmt::SetDerivedFrom(SwFmt *pDerFrom) SwFmtChg aOldFmt(this); SwFmtChg aNewFmt(this); - Modify( &aOldFmt, &aNewFmt ); + ModifyNotification( &aOldFmt, &aNewFmt ); return sal_True; } @@ -468,7 +468,7 @@ sal_Bool SwFmt::SetFmtAttr(const SfxPoolItem& rAttr ) SwAttrSetChg aChgOld( aSet, aOld ); SwAttrSetChg aChgNew( aSet, aNew ); - Modify( &aChgOld, &aChgNew ); // alle veraenderten werden verschickt + ModifyNotification( &aChgOld, &aChgNew ); // alle veraenderten werden verschickt } } return bRet; @@ -515,7 +515,7 @@ sal_Bool SwFmt::SetFmtAttr( const SfxItemSet& rSet ) aSet.SetModifyAtAttr( this ); SwAttrSetChg aChgOld( aSet, aOld ); SwAttrSetChg aChgNew( aSet, aNew ); - Modify( &aChgOld, &aChgNew ); // alle veraenderten werden verschickt + ModifyNotification( &aChgOld, &aChgNew ); // alle veraenderten werden verschickt } } return bRet; @@ -552,7 +552,7 @@ sal_Bool SwFmt::ResetFmtAttr( sal_uInt16 nWhich1, sal_uInt16 nWhich2 ) { SwAttrSetChg aChgOld( aSet, aOld ); SwAttrSetChg aChgNew( aSet, aNew ); - Modify( &aChgOld, &aChgNew ); // alle veraenderten werden verschickt + ModifyNotification( &aChgOld, &aChgNew ); // alle veraenderten werden verschickt } return bRet; } @@ -585,7 +585,7 @@ sal_uInt16 SwFmt::ResetAllFmtAttr() { SwAttrSetChg aChgOld( aSet, aOld ); SwAttrSetChg aChgNew( aSet, aNew ); - Modify( &aChgOld, &aChgNew ); // alle veraenderten werden verschickt + ModifyNotification( &aChgOld, &aChgNew ); // alle veraenderten werden verschickt } return aNew.Count(); } @@ -630,7 +630,7 @@ void SwFmt::DelDiffs( const SfxItemSet& rSet ) { SwAttrSetChg aChgOld( aSet, aOld ); SwAttrSetChg aChgNew( aSet, aNew ); - Modify( &aChgOld, &aChgNew ); // alle veraenderten werden verschickt + ModifyNotification( &aChgOld, &aChgNew ); // alle veraenderten werden verschickt } } diff --git a/sw/source/core/crsr/bookmrk.cxx b/sw/source/core/crsr/bookmrk.cxx index fa3cf8761bc0..30039539de96 100644 --- a/sw/source/core/crsr/bookmrk.cxx +++ b/sw/source/core/crsr/bookmrk.cxx @@ -167,9 +167,9 @@ namespace sw { namespace mark } - void MarkBase::Modify(SfxPoolItem *pOld, SfxPoolItem *pNew) + void MarkBase::Modify( const SfxPoolItem *pOld, const SfxPoolItem *pNew ) { - SwModify::Modify(pOld, pNew); + NotifyClients(pOld, pNew); if (pOld && (RES_REMOVE_UNO_OBJECT == pOld->Which())) { // invalidate cached uno object SetXBookmark(uno::Reference<text::XTextContent>(0)); diff --git a/sw/source/core/crsr/callnk.cxx b/sw/source/core/crsr/callnk.cxx index 7a496a422298..56b1f6ce6785 100644 --- a/sw/source/core/crsr/callnk.cxx +++ b/sw/source/core/crsr/callnk.cxx @@ -73,7 +73,7 @@ SwCallLink::SwCallLink( SwCrsrShell & rSh ) bHasSelection = ( *pCrsr->GetPoint() != *pCrsr->GetMark() ); if( ND_TEXTNODE & nNdTyp ) - nLeftFrmPos = SwCallLink::GetFrm( (SwTxtNode&)rNd, nCntnt, + nLeftFrmPos = SwCallLink::getLayoutFrm( rShell.GetLayout(), (SwTxtNode&)rNd, nCntnt, !rShell.ActionPend() ); else { @@ -102,7 +102,7 @@ SwCallLink::~SwCallLink() if( !pCNd ) return; - SwFrm *myFrm=pCNd->GetFrm(); + SwFrm *myFrm = pCNd->getLayoutFrm( rShell.GetLayout() ); if (myFrm!=NULL) { // We need to emulated a change of the row height in order @@ -112,7 +112,7 @@ SwCallLink::~SwCallLink() { const SwTableLine* pLine = pRow->GetTabLine( ); SwFmtFrmSize pSize = pLine->GetFrmFmt( )->GetFrmSize( ); - pRow->Modify( NULL, &pSize ); + pRow->ModifyNotification( NULL, &pSize ); } } @@ -124,7 +124,7 @@ SwCallLink::~SwCallLink() } if ( pNode != NULL ) { - SwFrm *myFrm2=pNode->GetFrm(); + SwFrm *myFrm2 = pNode->getLayoutFrm( rShell.GetLayout() ); if (myFrm2!=NULL) { // We need to emulated a change of the row height in order @@ -134,7 +134,7 @@ SwCallLink::~SwCallLink() { const SwTableLine* pLine = pRow->GetTabLine( ); SwFmtFrmSize pSize = pLine->GetFrmFmt( )->GetFrmSize( ); - pRow->Modify( NULL, &pSize ); + pRow->ModifyNotification( NULL, &pSize ); } } } @@ -165,7 +165,7 @@ SwCallLink::~SwCallLink() { // If travelling with left/right only and the frame is // unchanged (columns!) then check text hints. - if( nLeftFrmPos == SwCallLink::GetFrm( (SwTxtNode&)*pCNd, nAktCntnt, + if( nLeftFrmPos == SwCallLink::getLayoutFrm( rShell.GetLayout(), (SwTxtNode&)*pCNd, nAktCntnt, !rShell.ActionPend() ) && (( nCmp = nCntnt ) + 1 == nAktCntnt || // Right nCntnt -1 == ( nCmp = nAktCntnt )) ) // Left @@ -230,7 +230,7 @@ SwCallLink::~SwCallLink() const SwFrm* pFrm; const SwFlyFrm *pFlyFrm; - if( !rShell.ActionPend() && 0 != ( pFrm = pCNd->GetFrm(0,0,sal_False) ) && + if( !rShell.ActionPend() && 0 != ( pFrm = pCNd->getLayoutFrm(rShell.GetLayout(),0,0,sal_False) ) && 0 != ( pFlyFrm = pFrm->FindFlyFrm() ) && !rShell.IsTableMode() ) { const SwNodeIndex* pIndex = pFlyFrm->GetFmt()->GetCntnt().GetCntntIdx(); @@ -247,9 +247,9 @@ SwCallLink::~SwCallLink() } } -long SwCallLink::GetFrm( SwTxtNode& rNd, xub_StrLen nCntPos, sal_Bool bCalcFrm ) +long SwCallLink::getLayoutFrm( const SwRootFrm* pRoot, SwTxtNode& rNd, xub_StrLen nCntPos, sal_Bool bCalcFrm ) { - SwTxtFrm* pFrm = (SwTxtFrm*)rNd.GetFrm(0,0,bCalcFrm), *pNext = pFrm; + SwTxtFrm* pFrm = (SwTxtFrm*)rNd.getLayoutFrm(pRoot,0,0,bCalcFrm), *pNext = pFrm; if ( pFrm && !pFrm->IsHiddenNow() ) { if( pFrm->HasFollow() ) diff --git a/sw/source/core/crsr/callnk.hxx b/sw/source/core/crsr/callnk.hxx index b710b5db96c3..56aade636601 100644 --- a/sw/source/core/crsr/callnk.hxx +++ b/sw/source/core/crsr/callnk.hxx @@ -32,6 +32,7 @@ class SwCrsrShell; class SwTxtNode; +class SwRootFrm; class SwCallLink { @@ -49,7 +50,7 @@ public: bool bAktSelection ); ~SwCallLink(); - static long GetFrm( SwTxtNode& rNd, xub_StrLen nCntPos, sal_Bool bCalcFrm ); + static long getLayoutFrm( const SwRootFrm*, SwTxtNode& rNd, xub_StrLen nCntPos, sal_Bool bCalcFrm ); }; diff --git a/sw/source/core/crsr/crsrsh.cxx b/sw/source/core/crsr/crsrsh.cxx index 7ec342cfd3bc..a91ccd2ee847 100644 --- a/sw/source/core/crsr/crsrsh.cxx +++ b/sw/source/core/crsr/crsrsh.cxx @@ -200,8 +200,8 @@ SwPaM* SwCrsrShell::GetCrsr( sal_Bool bMakeTblCrsr ) const const SwCntntNode* pCNd; if( pTblCrsr->GetPoint()->nNode.GetIndex() && pTblCrsr->GetMark()->nNode.GetIndex() && - 0 != ( pCNd = pTblCrsr->GetCntntNode() ) && pCNd->GetFrm() && - 0 != ( pCNd = pTblCrsr->GetCntntNode(sal_False) ) && pCNd->GetFrm()) + 0 != ( pCNd = pTblCrsr->GetCntntNode() ) && pCNd->getLayoutFrm( GetLayout() ) && + 0 != ( pCNd = pTblCrsr->GetCntntNode(sal_False) ) && pCNd->getLayoutFrm( GetLayout() ) ) { SwShellTableCrsr* pTC = (SwShellTableCrsr*)pTblCrsr; GetLayout()->MakeTblCrsrs( *pTC ); @@ -229,7 +229,7 @@ void SwCrsrShell::StartAction() nAktNdTyp = rNd.GetNodeType(); bAktSelection = *pCurCrsr->GetPoint() != *pCurCrsr->GetMark(); if( ND_TEXTNODE & nAktNdTyp ) - nLeftFrmPos = SwCallLink::GetFrm( (SwTxtNode&)rNd, nAktCntnt, sal_True ); + nLeftFrmPos = SwCallLink::getLayoutFrm( GetLayout(), (SwTxtNode&)rNd, nAktCntnt, sal_True ); else nLeftFrmPos = 0; } @@ -296,6 +296,7 @@ void SwCrsrShell::EndAction( const sal_Bool bIdleEnd ) sal_uInt16 nParm = SwCrsrShell::CHKRANGE; if ( !bIdleEnd ) nParm |= SwCrsrShell::SCROLLWIN; +// if( !IsViewLocked() ) UpdateCrsr( nParm, bIdleEnd ); // Cursor-Aenderungen anzeigen { @@ -568,7 +569,7 @@ sal_Bool SwCrsrShell::MovePage( SwWhichPage fnWhichPage, SwPosPage fnPosPage ) SwCrsrSaveState aSaveState( *pCurCrsr ); Point& rPt = pCurCrsr->GetPtPos(); SwCntntFrm * pFrm = pCurCrsr->GetCntntNode()-> - GetFrm( &rPt, pCurCrsr->GetPoint() ); + getLayoutFrm( GetLayout(), &rPt, pCurCrsr->GetPoint(), sal_False ); if( pFrm && sal_True == ( bRet = GetFrmInPage( pFrm, fnWhichPage, fnPosPage, pCurCrsr ) ) && !pCurCrsr->IsSelOvr( nsSwCursorSelOverFlags::SELOVER_TOGGLE | @@ -614,7 +615,7 @@ SwFrm* lcl_IsInHeaderFooter( const SwNodeIndex& rIdx, Point& rPt ) SwCntntNode* pCNd = rIdx.GetNode().GetCntntNode(); if( pCNd ) { - pFrm = pCNd->GetFrm( &rPt, 0, sal_False )->GetUpper(); + pFrm = pCNd->getLayoutFrm( pCNd->GetDoc()->GetCurrentLayout(), &rPt, 0, sal_False )->GetUpper(); while( pFrm && !pFrm->IsHeaderFrm() && !pFrm->IsFooterFrm() ) pFrm = pFrm->IsFlyFrm() ? ((SwFlyFrm*)pFrm)->AnchorFrm() : pFrm->GetUpper(); @@ -700,10 +701,10 @@ int SwCrsrShell::SetCrsr( const Point &rLPt, sal_Bool bOnlyText, bool bBlock ) else if( aPos.nNode.GetNode().IsCntntNode() ) { // im gleichen Frame gelandet? - SwFrm* pOld = ((SwCntntNode&)aPos.nNode.GetNode()).GetFrm( - &aCharRect.Pos(), 0, sal_False ); - SwFrm* pNew = ((SwCntntNode&)aPos.nNode.GetNode()).GetFrm( - &aPt, 0, sal_False ); + SwFrm* pOld = ((SwCntntNode&)aPos.nNode.GetNode()).getLayoutFrm( + GetLayout(), &aCharRect.Pos(), 0, sal_False ); + SwFrm* pNew = ((SwCntntNode&)aPos.nNode.GetNode()).getLayoutFrm( + GetLayout(), &aPt, 0, sal_False ); if( pNew == pOld ) return bRet; } @@ -1226,7 +1227,7 @@ void SwCrsrShell::UpdateCrsrPos() Size aOldSz( GetDocSize() ); SwCntntNode *pCNode = pShellCrsr->GetCntntNode(); SwCntntFrm *pFrm = pCNode ? - pCNode->GetFrm( &pShellCrsr->GetPtPos(), pShellCrsr->GetPoint() ) :0; + pCNode->getLayoutFrm( GetLayout(), &pShellCrsr->GetPtPos(), pShellCrsr->GetPoint(), sal_False ) :0; if( !pFrm || (pFrm->IsTxtFrm() && ((SwTxtFrm*)pFrm)->IsHiddenNow()) ) { SwCrsrMoveState aTmpState( MV_NONE ); @@ -1359,7 +1360,7 @@ void SwCrsrShell::UpdateCrsr( sal_uInt16 eFlags, sal_Bool bIdleEnd ) } SwCntntFrm *pTblFrm = pPos->nNode.GetNode().GetCntntNode()-> - GetFrm( &aTmpPt, pPos ); + getLayoutFrm( GetLayout(), &aTmpPt, pPos, sal_False ); OSL_ENSURE( pTblFrm, "Tabelle Crsr nicht im Content ??" ); @@ -1376,7 +1377,8 @@ void SwCrsrShell::UpdateCrsr( sal_uInt16 eFlags, sal_Bool bIdleEnd ) // Second check if mark is in repeated headline: if ( !bInRepeatedHeadline ) { - SwCntntFrm* pMarkTblFrm = pITmpCrsr->GetCntntNode( sal_False )->GetFrm( &aTmpMk, pITmpCrsr->GetMark() ); + SwCntntFrm* pMarkTblFrm = pITmpCrsr->GetCntntNode( sal_False )-> + getLayoutFrm( GetLayout(), &aTmpMk, pITmpCrsr->GetMark(), sal_False ); OSL_ENSURE( pMarkTblFrm, "Tabelle Crsr nicht im Content ??" ); if ( pMarkTblFrm ) @@ -1587,8 +1589,8 @@ void SwCrsrShell::UpdateCrsr( sal_uInt16 eFlags, sal_Bool bIdleEnd ) sal_Bool bAgainst; do { bAgainst = sal_False; - pFrm = pShellCrsr->GetCntntNode()->GetFrm( - &pShellCrsr->GetPtPos(), pShellCrsr->GetPoint() ); + pFrm = pShellCrsr->GetCntntNode()->getLayoutFrm( GetLayout(), + &pShellCrsr->GetPtPos(), pShellCrsr->GetPoint(), sal_False ); // ist der Frm nicht mehr vorhanden, dann muss das gesamte Layout // erzeugt werden, weil ja mal hier einer vorhanden war !! if ( !pFrm ) @@ -1596,8 +1598,8 @@ void SwCrsrShell::UpdateCrsr( sal_uInt16 eFlags, sal_Bool bIdleEnd ) do { CalcLayout(); - pFrm = pShellCrsr->GetCntntNode()->GetFrm( - &pShellCrsr->GetPtPos(), pShellCrsr->GetPoint() ); + pFrm = pShellCrsr->GetCntntNode()->getLayoutFrm( GetLayout(), + &pShellCrsr->GetPtPos(), pShellCrsr->GetPoint(), sal_False ); } while( !pFrm ); } else if ( Imp()->IsIdleAction() ) @@ -1782,7 +1784,7 @@ void SwCrsrShell::RefreshBlockCursor() OSL_ENSURE( pBlockCrsr, "Don't call me without a block cursor" ); SwShellCrsr &rBlock = pBlockCrsr->getShellCrsr(); Point aPt = rBlock.GetPtPos(); - SwCntntFrm* pFrm = rBlock.GetCntntNode()->GetFrm( &aPt, rBlock.GetPoint() ); + SwCntntFrm* pFrm = rBlock.GetCntntNode()->getLayoutFrm( GetLayout(), &aPt, rBlock.GetPoint(), sal_False ); Point aMk; if( pBlockCrsr->getEndPoint() && pBlockCrsr->getStartPoint() ) { @@ -2100,13 +2102,13 @@ SwCntntFrm *SwCrsrShell::GetCurrFrm( const sal_Bool bCalcFrm ) const const sal_uInt16* pST = &nStartAction; ++(*((sal_uInt16*)pST)); const Size aOldSz( GetDocSize() ); - pRet = pNd->GetFrm( &pCurCrsr->GetPtPos(), pCurCrsr->GetPoint() ); + pRet = pNd->getLayoutFrm( GetLayout(), &pCurCrsr->GetPtPos(), pCurCrsr->GetPoint() ); --(*((sal_uInt16*)pST)); if( aOldSz != GetDocSize() ) ((SwCrsrShell*)this)->SizeChgNotify(); } else - pRet = pNd->GetFrm( &pCurCrsr->GetPtPos(), pCurCrsr->GetPoint(), sal_False); + pRet = pNd->getLayoutFrm( GetLayout(), &pCurCrsr->GetPtPos(), pCurCrsr->GetPoint(), sal_False); } return pRet; } @@ -2116,7 +2118,7 @@ SwCntntFrm *SwCrsrShell::GetCurrFrm( const sal_Bool bCalcFrm ) const // Link weitergeleitet. -void SwCrsrShell::Modify( SfxPoolItem* pOld, SfxPoolItem* pNew ) +void SwCrsrShell::Modify( const SfxPoolItem* pOld, const SfxPoolItem* pNew ) { const sal_uInt16 nWhich = pOld ? pOld->Which() : @@ -2286,7 +2288,7 @@ sal_Bool SwCrsrShell::SetVisCrsr( const Point &rPt ) pSectNd->GetSection().IsProtectFlag())) ) return sal_False; - SwCntntFrm *pFrm = pTxtNd->GetFrm( &aPt, &aPos ); + SwCntntFrm *pFrm = pTxtNd->getLayoutFrm( GetLayout(), &aPt, &aPos ); if ( Imp()->IsIdleAction() ) pFrm->PrepareCrsr(); SwRect aTmp( aCharRect ); @@ -2627,7 +2629,7 @@ SwCrsrShell::~SwCrsrShell() // der CursorShell haengt keine Chance geben, sich an den // TextNode zu haengen. if( GetRegisteredIn() ) - pRegisteredIn->Remove( this ); + GetRegisteredInNonConst()->Remove( this ); } SwShellCrsr* SwCrsrShell::getShellCrsr( bool bBlock ) @@ -2724,7 +2726,7 @@ sal_Bool SwCrsrShell::FindValidCntntNode( sal_Bool bOnlyText ) SwCntntNode* pCNd = rNdIdx.GetNode().GetCntntNode(); const SwCntntFrm * pFrm; - if( pCNd && 0 != (pFrm = pCNd->GetFrm(0,pCurCrsr->GetPoint(),sal_False)) && + if( pCNd && 0 != (pFrm = pCNd->getLayoutFrm( GetLayout(),0,pCurCrsr->GetPoint(),sal_False)) && !IsReadOnlyAvailable() && pFrm->IsProtected() && nNdIdx < rNds.GetEndOfExtras().GetIndex() ) { @@ -2840,7 +2842,7 @@ sal_Bool SwCrsrShell::FindValidCntntNode( sal_Bool bOnlyText ) if( bOk && rNdIdx.GetIndex() < rNds.GetEndOfExtras().GetIndex() ) { // Teste mal auf Fly - kann auch noch geschuetzt sein!! - if( 0 == (pFrm = pCNd->GetFrm(0,0,sal_False)) || + if( 0 == (pFrm = pCNd->getLayoutFrm( GetLayout(),0,0,sal_False)) || ( !IsReadOnlyAvailable() && pFrm->IsProtected() ) || ( bOnlyText && pCNd->IsNoTxtNode() ) ) { @@ -2871,7 +2873,7 @@ sal_Bool SwCrsrShell::FindValidCntntNode( sal_Bool bOnlyText ) // falls Cursor im versteckten Bereich ist, auf jedenfall schon mal // verschieben!! - if( !pCNd || !pCNd->GetFrm(0,0,sal_False) ) + if( !pCNd || !pCNd->getLayoutFrm( GetLayout(),0,0,sal_False) ) { SwCrsrMoveState aTmpState( MV_NONE ); aTmpState.bSetInReadOnly = IsReadOnlyAvailable(); @@ -3422,7 +3424,7 @@ void SwCrsrShell::GetSmartTagTerm( const Point& rPt, SwRect& rSelectRect, SwCrsrMoveState aState; aState.bRealWidth = sal_True; SwCntntNode* pCntntNode = pCrsr->GetCntntNode(); - SwCntntFrm *pCntntFrame = pCntntNode->GetFrm( &rPt, pCrsr->GetPoint(), sal_False); + SwCntntFrm *pCntntFrame = pCntntNode->getLayoutFrm( GetLayout(), &rPt, pCrsr->GetPoint(), sal_False); pCntntFrame->GetCharRect( aStartRect, *pCrsr->GetPoint(), &aState ); rContent = nWordEnd - 1; diff --git a/sw/source/core/crsr/crstrvl.cxx b/sw/source/core/crsr/crstrvl.cxx index 610b3f988a3a..712670302367 100644 --- a/sw/source/core/crsr/crstrvl.cxx +++ b/sw/source/core/crsr/crstrvl.cxx @@ -73,7 +73,7 @@ #include <fmturl.hxx> #include "txtfrm.hxx" #include <wrong.hxx> - +#include <switerator.hxx> #include <vcl/window.hxx> #include <docufld.hxx> @@ -94,7 +94,7 @@ sal_Bool SwCrsrShell::GotoNextNum() // dann versuche den Cursor auf die Position zu setzen, // auf halber Heohe vom Char-SRectangle Point aPt( pCurCrsr->GetPtPos() ); - SwCntntFrm * pFrm = pCurCrsr->GetCntntNode()->GetFrm( &aPt, + SwCntntFrm * pFrm = pCurCrsr->GetCntntNode()->getLayoutFrm( GetLayout(), &aPt, pCurCrsr->GetPoint() ); pFrm->GetCharRect( aCharRect, *pCurCrsr->GetPoint() ); pFrm->Calc(); @@ -134,7 +134,7 @@ sal_Bool SwCrsrShell::GotoPrevNum() // dann versuche den Cursor auf die Position zu setzen, // auf halber Heohe vom Char-SRectangle Point aPt( pCurCrsr->GetPtPos() ); - SwCntntFrm * pFrm = pCurCrsr->GetCntntNode()->GetFrm( &aPt, + SwCntntFrm * pFrm = pCurCrsr->GetCntntNode()->getLayoutFrm( GetLayout(), &aPt, pCurCrsr->GetPoint() ); pFrm->GetCharRect( aCharRect, *pCurCrsr->GetPoint() ); pFrm->Calc(); @@ -278,7 +278,7 @@ sal_Bool SwCrsrShell::SetCrsrInHdFt( sal_uInt16 nDescNo, sal_Bool bInHeader ) const SwFrm* pFrm; Point aPt( pCurCrsr->GetPtPos() ); - if( pCNd && 0 != ( pFrm = pCNd->GetFrm( &aPt, 0, sal_False ) )) + if( pCNd && 0 != ( pFrm = pCNd->getLayoutFrm( GetLayout(), &aPt, 0, sal_False ) )) { // dann kann der Cursor ja auch hinein gesetzt werden SwCallLink aLk( *this ); // Crsr-Moves ueberwachen, evt. Link callen @@ -326,7 +326,7 @@ sal_Bool SwCrsrShell::GotoNextTOXBase( const String* pName ) const SwCntntFrm* pCFrm; if( pCNd && pCNd->EndOfSectionIndex() <= pSectNd->EndOfSectionIndex() && - 0 != ( pCFrm = pCNd->GetFrm() ) && + 0 != ( pCFrm = pCNd->getLayoutFrm( GetLayout() ) ) && ( IsReadOnlyAvailable() || !pCFrm->IsProtected() )) { pFnd = pCNd; @@ -373,7 +373,7 @@ sal_Bool SwCrsrShell::GotoPrevTOXBase( const String* pName ) const SwCntntFrm* pCFrm; if( pCNd && pCNd->EndOfSectionIndex() <= pSectNd->EndOfSectionIndex() && - 0 != ( pCFrm = pCNd->GetFrm() ) && + 0 != ( pCFrm = pCNd->getLayoutFrm( GetLayout() ) ) && ( IsReadOnlyAvailable() || !pCFrm->IsProtected() )) { pFnd = pCNd; @@ -407,14 +407,13 @@ sal_Bool SwCrsrShell::GotoTOXMarkBase() // dann nehme den 1. und hole den Verzeichnis-Typ. // Suche in seiner Abhaengigkeitsliste nach dem eigentlichem // Verzeichnis - SwModify* pType = (SwModify*)aMarks[0]->GetRegisteredIn(); - SwClientIter aIter( *pType ); + const SwTOXType* pType = aMarks[0]->GetTOXType(); + SwIterator<SwTOXBase,SwTOXType> aIter( *pType ); const SwSectionNode* pSectNd; const SwSectionFmt* pSectFmt; - for( SwTOXBase* pTOX = - (SwTOXBase*)aIter.First( TYPE( SwTOXBase )); - pTOX; pTOX = (SwTOXBase*)aIter.Next() ) + for( SwTOXBase* pTOX = aIter.First(); pTOX; pTOX = aIter.Next() ) + { if( pTOX->ISA( SwTOXBaseSection ) && 0 != ( pSectFmt = ((SwTOXBaseSection*)pTOX)->GetFmt() ) && 0 != ( pSectNd = pSectFmt->GetSectionNode() )) @@ -426,7 +425,7 @@ sal_Bool SwCrsrShell::GotoTOXMarkBase() const SwCntntFrm* pCFrm; if( pCNd && pCNd->EndOfSectionIndex() < pSectNd->EndOfSectionIndex() && - 0 != ( pCFrm = pCNd->GetFrm() ) && + 0 != ( pCFrm = pCNd->getLayoutFrm( GetLayout() ) ) && ( IsReadOnlyAvailable() || !pCFrm->IsProtected() )) { SwCallLink aLk( *this ); // Crsr-Moves ueberwachen, @@ -441,6 +440,7 @@ sal_Bool SwCrsrShell::GotoTOXMarkBase() } } } + } return bRet; } @@ -474,9 +474,8 @@ sal_Bool SwCrsrShell::GotoNxtPrvTblFormula( sal_Bool bNext, sal_Bool bOnlyErrors if( rPos.nNode < GetDoc()->GetNodes().GetEndOfExtras() ) // auch beim Einsammeln wird nur der erste Frame benutzt! - aCurGEF.SetBodyPos( *rPos.nNode.GetNode().GetCntntNode()->GetFrm( + aCurGEF.SetBodyPos( *rPos.nNode.GetNode().GetCntntNode()->getLayoutFrm( GetLayout(), &aPt, &rPos, sal_False ) ); - { const SfxPoolItem* pItem; const SwTableBox* pTBox; @@ -494,7 +493,7 @@ sal_Bool SwCrsrShell::GotoNxtPrvTblFormula( sal_Bool bNext, sal_Bool bOnlyErrors const SwCntntFrm* pCFrm; SwNodeIndex aIdx( *pTBox->GetSttNd() ); const SwCntntNode* pCNd = GetDoc()->GetNodes().GoNext( &aIdx ); - if( pCNd && 0 != ( pCFrm = pCNd->GetFrm( &aPt, 0, sal_False ) ) && + if( pCNd && 0 != ( pCFrm = pCNd->getLayoutFrm( GetLayout(), &aPt, 0, sal_False ) ) && (IsReadOnlyAvailable() || !pCFrm->IsProtected() )) { _SetGetExpFld aCmp( *pTBox ); @@ -545,8 +544,7 @@ sal_Bool SwCrsrShell::GotoNxtPrvTOXMark( sal_Bool bNext ) if( rPos.nNode.GetIndex() < GetDoc()->GetNodes().GetEndOfExtras().GetIndex() ) // auch beim Einsammeln wird nur der erste Frame benutzt! aCurGEF.SetBodyPos( *rPos.nNode.GetNode(). - GetCntntNode()->GetFrm( &aPt, &rPos, sal_False ) ); - + GetCntntNode()->getLayoutFrm( GetLayout(), &aPt, &rPos, sal_False ) ); { const SfxPoolItem* pItem; const SwCntntFrm* pCFrm; @@ -559,7 +557,7 @@ sal_Bool SwCrsrShell::GotoNxtPrvTOXMark( sal_Bool bNext ) RES_TXTATR_TOXMARK, n ) ) && 0 != (pTxtTOX = ((SwTOXMark*)pItem)->GetTxtTOXMark() ) && ( pTxtNd = &pTxtTOX->GetTxtNode())->GetNodes().IsDocNodes() && - 0 != ( pCFrm = pTxtNd->GetFrm( &aPt, 0, sal_False )) && + 0 != ( pCFrm = pTxtNd->getLayoutFrm( GetLayout(), &aPt, 0, sal_False )) && ( IsReadOnlyAvailable() || !pCFrm->IsProtected() )) { SwNodeIndex aNdIndex( *pTxtNd ); // UNIX benoetigt dieses Obj. @@ -626,18 +624,18 @@ void lcl_MakeFldLst( _SetGetExpFlds& rLst, const SwFieldType& rFldType, // es muss immer der 1. Frame gesucht werden Point aPt; SwTxtFld* pTxtFld; - SwClientIter aIter( (SwFieldType&)rFldType ); - sal_Bool bSubType = nSubType != USHRT_MAX; - for( SwClient* pLast = aIter.First( TYPE( SwFmtFld )); pLast; pLast = aIter.Next() ) - if( 0 != ( pTxtFld = ((SwFmtFld*)pLast)->GetTxtFld() ) && + SwIterator<SwFmtFld,SwFieldType> aIter(rFldType); + bool bSubType = nSubType != USHRT_MAX; + for( SwFmtFld* pFmtFld = aIter.First(); pFmtFld; pFmtFld = aIter.Next() ) + if( 0 != ( pTxtFld = pFmtFld->GetTxtFld() ) && ( !bChkInpFlag || ((SwSetExpField*)pTxtFld->GetFld().GetFld()) ->GetInputFlag() ) && - (!bSubType || (((SwFmtFld*)pLast)->GetFld()->GetSubType() + (!bSubType || (pFmtFld->GetFld()->GetSubType() & 0xff ) == nSubType )) { SwCntntFrm* pCFrm; const SwTxtNode& rTxtNode = pTxtFld->GetTxtNode(); - if( 0 != ( pCFrm = rTxtNode.GetFrm( &aPt, 0, sal_False )) && + if( 0 != ( pCFrm = rTxtNode.getLayoutFrm( rTxtNode.GetDoc()->GetCurrentLayout(), &aPt, 0, sal_False )) && ( bInReadOnly || !pCFrm->IsProtected() )) { _SetGetExpFld* pNew = new _SetGetExpFld( @@ -722,7 +720,7 @@ sal_Bool SwCrsrShell::MoveFldType( const SwFieldType* pFldType, sal_Bool bNext, { // auch beim Einsammeln wird nur der erste Frame benutzt! Point aPt; - aSrch.SetBodyPos( *pTNd->GetFrm( &aPt, &rPos, sal_False ) ); + aSrch.SetBodyPos( *pTNd->getLayoutFrm( GetLayout(), &aPt, &rPos, sal_False ) ); } sal_Bool bFound = aSrtLst.Seek_Entry( &aSrch, &nPos ); @@ -1097,7 +1095,7 @@ sal_Bool SwCrsrShell::GetContentAtPos( const Point& rPt, { rCntntAtPos.eCntntAtPos = SwContentAtPos::SW_SMARTTAG; - if( pFldRect && 0 != ( pFrm = pTxtNd->GetFrm( &aPt ) ) ) + if( pFldRect && 0 != ( pFrm = pTxtNd->getLayoutFrm( GetLayout(), &aPt ) ) ) pFrm->GetCharRect( *pFldRect, aPos, &aTmpState ); } } @@ -1117,7 +1115,7 @@ sal_Bool SwCrsrShell::GetContentAtPos( const Point& rPt, if( pFld ) { - if( pFldRect && 0 != ( pFrm = pTxtNd->GetFrm( &aPt ) ) ) + if( pFldRect && 0 != ( pFrm = pTxtNd->getLayoutFrm( GetLayout(), &aPt ) ) ) pFrm->GetCharRect( *pFldRect, aPos, &aTmpState ); if( bSetCrsr ) @@ -1215,7 +1213,7 @@ sal_Bool SwCrsrShell::GetContentAtPos( const Point& rPt, rCntntAtPos.pFndTxtAttr = pTxtAttr; rCntntAtPos.aFnd.pAttr = &pTxtAttr->GetAttr(); - if( pFldRect && 0 != ( pFrm = pTxtNd->GetFrm( &aPt ) ) ) + if( pFldRect && 0 != ( pFrm = pTxtNd->getLayoutFrm( GetLayout(), &aPt ) ) ) pFrm->GetCharRect( *pFldRect, aPos, &aTmpState ); } } @@ -1283,7 +1281,7 @@ sal_Bool SwCrsrShell::GetContentAtPos( const Point& rPt, rCntntAtPos.pFndTxtAttr = pTxtAttr; rCntntAtPos.aFnd.pAttr = &pTxtAttr->GetAttr(); - if( pFldRect && 0 != ( pFrm = pTxtNd->GetFrm( &aPt ) ) ) + if( pFldRect && 0 != ( pFrm = pTxtNd->getLayoutFrm( GetLayout(), &aPt ) ) ) pFrm->GetCharRect( *pFldRect, aPos, &aTmpState ); } } @@ -1320,7 +1318,7 @@ sal_Bool SwCrsrShell::GetContentAtPos( const Point& rPt, rCntntAtPos.eCntntAtPos = SwContentAtPos::SW_INETATTR; rCntntAtPos.pFndTxtAttr = pTxtAttr; - if( pFldRect && 0 != ( pFrm = pTxtNd->GetFrm( &aPt ) ) ) + if( pFldRect && 0 != ( pFrm = pTxtNd->getLayoutFrm( GetLayout(), &aPt ) ) ) pFrm->GetCharRect( *pFldRect, aPos, &aTmpState ); } } @@ -1336,7 +1334,7 @@ sal_Bool SwCrsrShell::GetContentAtPos( const Point& rPt, rCntntAtPos.pFndTxtAttr = 0; bRet = sal_True; - if( pFldRect && 0 != ( pFrm = pTxtNd->GetFrm( &aPt ) ) ) + if( pFldRect && 0 != ( pFrm = pTxtNd->getLayoutFrm( GetLayout(), &aPt ) ) ) pFrm->GetCharRect( *pFldRect, aPos, &aTmpState ); } } @@ -1367,7 +1365,7 @@ sal_Bool SwCrsrShell::GetContentAtPos( const Point& rPt, #endif ) { - SwFrm* pF = pTxtNd->GetFrm( &aPt ); + SwFrm* pF = pTxtNd->getLayoutFrm( GetLayout(), &aPt ); if( pF ) { // dann aber den CellFrame @@ -1574,9 +1572,10 @@ sal_Bool SwContentAtPos::IsInProtectSect() const const SwCntntFrm* pFrm; return pNd && ( pNd->IsInProtectSect() || - ( 0 != ( pFrm = pNd->GetFrm(0,0,sal_False)) && + ( 0 != ( pFrm = pNd->getLayoutFrm( pNd->GetDoc()->GetCurrentLayout(), 0,0,sal_False)) && pFrm->IsProtected() )); } + bool SwContentAtPos::IsInRTLText()const { bool bRet = false; @@ -1596,20 +1595,16 @@ bool SwContentAtPos::IsInRTLText()const } if(pNd) { - SwClientIter aClientIter( * const_cast<SwTxtNode*>(pNd) ); - SwClient* pLast = aClientIter.GoStart(); - while( pLast ) + SwIterator<SwTxtFrm,SwTxtNode> aIter(*pNd); + SwTxtFrm* pTmpFrm = aIter.First(); + while( pTmpFrm ) { - if ( pLast->ISA( SwTxtFrm ) ) - { - SwTxtFrm* pTmpFrm = static_cast<SwTxtFrm*>( pLast ); if ( !pTmpFrm->IsFollow()) { bRet = pTmpFrm->IsRightToLeft(); break; } - } - pLast = ++aClientIter; + pTmpFrm = aIter.Next(); } } return bRet; @@ -2083,7 +2078,7 @@ sal_Bool SwCrsrShell::SelectNxtPrvHyperlink( sal_Bool bNext ) { const SwCntntNode* pCNd = aCurPos.GetNodeFromCntnt()->GetCntntNode(); SwCntntFrm* pFrm; - if( pCNd && 0 != ( pFrm = pCNd->GetFrm( &aPt )) ) + if( pCNd && 0 != ( pFrm = pCNd->getLayoutFrm( GetLayout(), &aPt )) ) aCurPos.SetBodyPos( *pFrm ); } @@ -2093,19 +2088,18 @@ sal_Bool SwCrsrShell::SelectNxtPrvHyperlink( sal_Bool bNext ) const SwCharFmts* pFmts = GetDoc()->GetCharFmts(); for( sal_uInt16 n = pFmts->Count(); 1 < n; ) { - SwClientIter aIter( *(*pFmts)[ --n ] ); + SwIterator<SwTxtINetFmt,SwCharFmt> aIter(*(*pFmts)[--n]); - for( SwClient* pFnd = aIter.First(TYPE( SwTxtINetFmt )); - pFnd; pFnd = aIter.Next() ) - if( 0 != ( pTxtNd = ((SwTxtINetFmt*)pFnd)->GetpTxtNode()) && + for( SwTxtINetFmt* pFnd = aIter.First(); pFnd; pFnd = aIter.Next() ) + if( 0 != ( pTxtNd = pFnd->GetpTxtNode()) && pTxtNd->GetNodes().IsDocNodes() ) { - SwTxtINetFmt& rAttr = *(SwTxtINetFmt*)pFnd; + SwTxtINetFmt& rAttr = *pFnd; SwPosition aTmpPos( *pTxtNd ); _SetGetExpFld aPos( aTmpPos.nNode, rAttr ); SwCntntFrm* pFrm; if( pTxtNd->GetIndex() < nBodySttNdIdx && - 0 != ( pFrm = pTxtNd->GetFrm( &aPt )) ) + 0 != ( pFrm = pTxtNd->getLayoutFrm( GetLayout(), &aPt )) ) aPos.SetBodyPos( *pFrm ); if( bNext diff --git a/sw/source/core/crsr/crstrvl1.cxx b/sw/source/core/crsr/crstrvl1.cxx index 0c28f43c0965..96bc4636d0bf 100644 --- a/sw/source/core/crsr/crstrvl1.cxx +++ b/sw/source/core/crsr/crstrvl1.cxx @@ -96,7 +96,7 @@ sal_Bool SwCrsrShell::GoStartSentence() sal_Bool SwCrsrShell::SelectWord( const Point* pPt ) { - return pCurCrsr->SelectWord( pPt ); + return pCurCrsr->SelectWord( this, pPt ); } sal_Bool SwCrsrShell::ExpandToSentenceBorders() diff --git a/sw/source/core/crsr/pam.cxx b/sw/source/core/crsr/pam.cxx index 24a51cd362e1..fa79b3e5f397 100644 --- a/sw/source/core/crsr/pam.cxx +++ b/sw/source/core/crsr/pam.cxx @@ -634,7 +634,7 @@ sal_uInt16 SwPaM::GetPageNum( sal_Bool bAtPoint, const Point* pLayPos ) const SwPosition* pPos = bAtPoint ? m_pPoint : m_pMark; if( 0 != ( pNd = pPos->nNode.GetNode().GetCntntNode() ) && - 0 != ( pCFrm = pNd->GetFrm( pLayPos, pPos, sal_False )) && + 0 != ( pCFrm = pNd->getLayoutFrm( pNd->GetDoc()->GetCurrentLayout(), pLayPos, pPos, sal_False )) && 0 != ( pPg = pCFrm->FindPageFrm() )) return pPg->GetPhyPageNum(); return 0; @@ -675,7 +675,7 @@ sal_Bool SwPaM::HasReadonlySel( bool bFormView ) const const SwCntntFrm *pFrm; if( 0 != ( pNd = GetPoint()->nNode.GetNode().GetCntntNode() )) - pFrm = pNd->GetFrm( &aTmpPt, GetPoint(), sal_False ); + pFrm = pNd->getLayoutFrm( pNd->GetDoc()->GetCurrentLayout(), &aTmpPt, GetPoint(), sal_False ); else pFrm = 0; @@ -697,7 +697,7 @@ sal_Bool SwPaM::HasReadonlySel( bool bFormView ) const if( !bRet && HasMark() && GetPoint()->nNode != GetMark()->nNode ) { if( 0 != ( pNd = GetMark()->nNode.GetNode().GetCntntNode() )) - pFrm = pNd->GetFrm( &aTmpPt, GetMark(), sal_False ); + pFrm = pNd->getLayoutFrm( pNd->GetDoc()->GetCurrentLayout(), &aTmpPt, GetMark(), sal_False ); else pFrm = 0; @@ -832,7 +832,7 @@ SwCntntNode* GetNode( SwPaM & rPam, sal_Bool& rbFirst, SwMoveFn fnMove, { if( ( - 0 == ( pFrm = pNd->GetFrm()) || + 0 == ( pFrm = pNd->getLayoutFrm( pNd->GetDoc()->GetCurrentLayout() ) ) || ( !bInReadOnly && pFrm->IsProtected() ) || (pFrm->IsTxtFrm() && ((SwTxtFrm*)pFrm)->IsHiddenNow()) ) || @@ -869,7 +869,7 @@ SwCntntNode* GetNode( SwPaM & rPam, sal_Bool& rbFirst, SwMoveFn fnMove, { // nur in der AutoTextSection koennen Node stehen, die // nicht angezeigt werden !! - if( 0 == ( pFrm = pNd->GetFrm()) || + if( 0 == ( pFrm = pNd->getLayoutFrm( pNd->GetDoc()->GetCurrentLayout() ) ) || ( !bInReadOnly && pFrm->IsProtected() ) || ( pFrm->IsTxtFrm() && ((SwTxtFrm*)pFrm)->IsHiddenNow() ) ) @@ -1193,7 +1193,7 @@ void SwPaM::InvalidatePaM() SwInsTxt aHint( Start()->nContent.GetIndex(), End()->nContent.GetIndex() - Start()->nContent.GetIndex() + 1 ); SwModify *_pModify=(SwModify*)_pTxtNd; - _pModify->Modify( 0, &aHint); + _pModify->ModifyNotification( 0, &aHint); } } diff --git a/sw/source/core/crsr/swcrsr.cxx b/sw/source/core/crsr/swcrsr.cxx index 432ef6d0d281..9d26aaac80c9 100644..100755 --- a/sw/source/core/crsr/swcrsr.cxx +++ b/sw/source/core/crsr/swcrsr.cxx @@ -32,10 +32,8 @@ #include <hintids.hxx> #include <editeng/protitem.hxx> - #include <com/sun/star/i18n/WordType.hdl> #include <com/sun/star/i18n/CharType.hdl> - #include <unotools/charclass.hxx> #include <svl/ctloptions.hxx> #include <swmodule.hxx> @@ -55,6 +53,7 @@ #include <scriptinfo.hxx> #include <crstate.hxx> #include <docsh.hxx> +#include <viewsh.hxx> #include <frmatr.hxx> #include <breakit.hxx> #include <crsskip.hxx> @@ -347,7 +346,7 @@ sal_Bool SwCursor::IsSelOvr( int eFlags ) const SwNode* pNd = &GetPoint()->nNode.GetNode(); if( pNd->IsCntntNode() && !dynamic_cast<SwUnoCrsr*>(this) ) { - const SwCntntFrm* pFrm = ((SwCntntNode*)pNd)->GetFrm(); + const SwCntntFrm* pFrm = ((SwCntntNode*)pNd)->getLayoutFrm( pDoc->GetCurrentLayout() ); if( pFrm && pFrm->IsValid() && 0 == pFrm->Frm().Height() && 0 != ( nsSwCursorSelOverFlags::SELOVER_CHANGEPOS & eFlags ) ) { @@ -364,7 +363,7 @@ sal_Bool SwCursor::IsSelOvr( int eFlags ) if( !pFrm ) { bGoNxt = !bGoNxt; - pFrm = ((SwCntntNode*)pNd)->GetFrm(); + pFrm = ((SwCntntNode*)pNd)->getLayoutFrm( pDoc->GetCurrentLayout() ); while ( pFrm && 0 == pFrm->Frm().Height() ) { pFrm = bGoNxt ? pFrm->GetNextCntntFrm() @@ -421,7 +420,7 @@ sal_Bool SwCursor::IsSelOvr( int eFlags ) const SwTableNode* pPtNd = pNd->FindTableNode(); if( (pNd = &GetMark()->nNode.GetNode())->IsCntntNode() && - !((SwCntntNode*)pNd)->GetFrm() && !dynamic_cast<SwUnoCrsr*>(this) ) + !((SwCntntNode*)pNd)->getLayoutFrm( pDoc->GetCurrentLayout() ) && !dynamic_cast<SwUnoCrsr*>(this) ) { DeleteMark(); RestoreSavePos(); @@ -692,7 +691,7 @@ sal_Bool SwCursor::IsAtValidPos( sal_Bool bPoint ) const const SwPosition* pPos = bPoint ? GetPoint() : GetMark(); const SwNode* pNd = &pPos->nNode.GetNode(); - if( pNd->IsCntntNode() && !((SwCntntNode*)pNd)->GetFrm() && + if( pNd->IsCntntNode() && !((SwCntntNode*)pNd)->getLayoutFrm( pDoc->GetCurrentLayout() ) && !dynamic_cast<const SwUnoCrsr*>(this) ) { return sal_False; @@ -970,7 +969,7 @@ sal_uLong SwCursor::FindAll( SwFindParas& rParas, { // Cursor als Kopie vom akt. und in den Ring aufnehmen // Verkettung zeigt immer auf den zuerst erzeugten, also vorwaerts - SwCursor* pSav = Create( this ); // sicher den aktuellen Crsr + std::auto_ptr< SwCursor > pSav( Create( this ) ); // save the current cursor // wenn schon ausserhalb vom Bodytext, suche von der Position, // ansonsten beginne mit der 1. GrundSection @@ -999,11 +998,10 @@ sal_uLong SwCursor::FindAll( SwFindParas& rParas, } else DeleteMark(); - delete pSav; return 0; } + pSav.release(); - delete pSav; if( !( FND_IN_SELALL & eFndRngs )) { // es sollte nur einer gesucht werden, also fuege in dazu @@ -1029,7 +1027,7 @@ sal_uLong SwCursor::FindAll( SwFindParas& rParas, } else if( FND_IN_SELALL & eFndRngs ) { - SwCursor* pSav = Create( this ); // sicher den aktuellen Crsr + ::std::auto_ptr< SwCursor> pSav( Create( this ) ); // save the current cursor const SwNode* pSttNd = ( FND_IN_BODYONLY & eFndRngs ) ? rNds.GetEndOfContent().StartOfSectionNode() @@ -1054,13 +1052,9 @@ sal_uLong SwCursor::FindAll( SwFindParas& rParas, } else DeleteMark(); - delete pSav; return 0; } - // es wurde ein- bis mehrmals gefunden. Das steht alles - // im neuen Crsr-Ring. Darum hebe erstmal den alten Ring auf - delete pSav; - + pSav.release(); while( GetNext() != this ) delete GetNext(); @@ -1175,9 +1169,9 @@ sal_Bool SwCursor::GoPrevWord() return GoPrevWordWT( WordType::ANYWORD_IGNOREWHITESPACES ); } -sal_Bool SwCursor::SelectWord( const Point* pPt ) +sal_Bool SwCursor::SelectWord( ViewShell* pViewShell, const Point* pPt ) { - return SelectWordWT( WordType::ANYWORD_IGNOREWHITESPACES, pPt ); + return SelectWordWT( pViewShell, WordType::ANYWORD_IGNOREWHITESPACES, pPt ); } sal_Bool SwCursor::IsStartWordWT( sal_Int16 nWordType ) const @@ -1353,20 +1347,20 @@ sal_Bool SwCursor::GoPrevWordWT( sal_Int16 nWordType ) return bRet; } -sal_Bool SwCursor::SelectWordWT( sal_Int16 nWordType, const Point* pPt ) +sal_Bool SwCursor::SelectWordWT( ViewShell* pViewShell, sal_Int16 nWordType, const Point* pPt ) { SwCrsrSaveState aSave( *this ); sal_Bool bRet = sal_False; sal_Bool bForward = sal_True; DeleteMark(); - SwRootFrm* pLayout; - if( pPt && 0 != (pLayout = GetDoc()->GetRootFrm()) ) + const SwRootFrm* pLayout = pViewShell->GetLayout(); + if( pPt && 0 != pLayout ) { // set the cursor to the layout position Point aPt( *pPt ); pLayout->GetCrsrOfst( GetPoint(), aPt ); - } + } //swmod 071107//swmod 071225 const SwTxtNode* pTxtNd = GetNode()->GetTxtNode(); if( pTxtNd && pBreakIt->GetBreakIter().is() ) @@ -1596,7 +1590,7 @@ SwCursor::DoSetBidiLevelLeftRight( // for visual cursor travelling (used in bidi layout) // we first have to convert the logic to a visual position Point aPt; - pSttFrm = rTNd.GetFrm( &aPt, GetPoint() ); + pSttFrm = rTNd.getLayoutFrm( GetDoc()->GetCurrentLayout(), &aPt, GetPoint() ); if( pSttFrm ) { sal_uInt8 nCrsrLevel = GetCrsrBidiLevel(); @@ -1735,7 +1729,7 @@ sal_Bool SwCursor::LeftRight( sal_Bool bLeft, sal_uInt16 nCnt, sal_uInt16 nMode, if ( &rTmpNode != &rNode && rTmpNode.IsTxtNode() ) { Point aPt; - const SwCntntFrm* pEndFrm = ((SwTxtNode&)rTmpNode).GetFrm( &aPt, GetPoint() ); + const SwCntntFrm* pEndFrm = ((SwTxtNode&)rTmpNode).getLayoutFrm( GetDoc()->GetCurrentLayout(), &aPt, GetPoint() ); if ( pEndFrm ) { if ( ! pEndFrm->IsRightToLeft() != ! pSttFrm->IsRightToLeft() ) @@ -1804,7 +1798,7 @@ sal_Bool SwCursor::UpDown( sal_Bool bUp, sal_uInt16 nCnt, Point aPt; if( pPt ) aPt = *pPt; - SwCntntFrm* pFrm = GetCntntNode()->GetFrm( &aPt, GetPoint() ); + SwCntntFrm* pFrm = GetCntntNode()->getLayoutFrm( GetDoc()->GetCurrentLayout(), &aPt, GetPoint() ); if( pFrm ) { @@ -1842,7 +1836,7 @@ sal_Bool SwCursor::UpDown( sal_Bool bUp, sal_uInt16 nCnt, const SwNode* pEndNd = pTblNd->EndOfSectionNode(); GetPoint()->nNode = *pEndNd; pTblCrsr->Move( fnMoveBackward, fnGoNode ); - pFrm = GetCntntNode()->GetFrm( &aPt, GetPoint() ); + pFrm = GetCntntNode()->getLayoutFrm( GetDoc()->GetCurrentLayout(), &aPt, GetPoint() ); } } @@ -1851,7 +1845,7 @@ sal_Bool SwCursor::UpDown( sal_Bool bUp, sal_uInt16 nCnt, : pFrm->UnitDown( this, nUpDownX, bInReadOnly ) ) && CheckNodesRange( aOldPos.nNode, GetPoint()->nNode, bChkRange )) { - pFrm = GetCntntNode()->GetFrm( &aPt, GetPoint() ); + pFrm = GetCntntNode()->getLayoutFrm( GetDoc()->GetCurrentLayout(), &aPt, GetPoint() ); --nCnt; } @@ -1862,7 +1856,7 @@ sal_Bool SwCursor::UpDown( sal_Bool bUp, sal_uInt16 nCnt, { // dann versuche den Cursor auf die Position zu setzen, // auf halber Heohe vom Char-Rectangle - pFrm = GetCntntNode()->GetFrm( &aPt, GetPoint() ); + pFrm = GetCntntNode()->getLayoutFrm( GetDoc()->GetCurrentLayout(), &aPt, GetPoint() ); SwCrsrMoveState eTmpState( MV_UPDOWN ); eTmpState.bSetInReadOnly = bInReadOnly; SwRect aTmpRect; @@ -1895,7 +1889,7 @@ sal_Bool SwCursor::UpDown( sal_Bool bUp, sal_uInt16 nCnt, sal_Bool SwCursor::LeftRightMargin( sal_Bool bLeft, sal_Bool bAPI ) { Point aPt; - SwCntntFrm * pFrm = GetCntntNode()->GetFrm( &aPt, GetPoint() ); + SwCntntFrm * pFrm = GetCntntNode()->getLayoutFrm( GetDoc()->GetCurrentLayout(), &aPt, GetPoint() ); // calculate cursor bidi level if ( pFrm ) @@ -1909,7 +1903,7 @@ sal_Bool SwCursor::IsAtLeftRightMargin( sal_Bool bLeft, sal_Bool bAPI ) const { sal_Bool bRet = sal_False; Point aPt; - SwCntntFrm * pFrm = GetCntntNode()->GetFrm( &aPt, GetPoint() ); + SwCntntFrm * pFrm = GetCntntNode()->getLayoutFrm( GetDoc()->GetCurrentLayout(), &aPt, GetPoint() ); if( pFrm ) { SwPaM aPam( *GetPoint() ); diff --git a/sw/source/core/crsr/trvlfnfl.cxx b/sw/source/core/crsr/trvlfnfl.cxx index c2ead9272ea0..765e4094712a 100644 --- a/sw/source/core/crsr/trvlfnfl.cxx +++ b/sw/source/core/crsr/trvlfnfl.cxx @@ -96,7 +96,7 @@ sal_Bool SwCrsrShell::GotoFtnTxt() _GetCrsr()->GetPoint()->nNode.GetNode().GetTxtNode() : NULL; if( pTxtNd ) { - const SwFrm *pFrm = pTxtNd->GetFrm( &_GetCrsr()->GetSttPos(), + const SwFrm *pFrm = pTxtNd->getLayoutFrm( GetLayout(), &_GetCrsr()->GetSttPos(), _GetCrsr()->Start() ); const SwFtnBossFrm* pFtnBoss; sal_Bool bSkip = pFrm && pFrm->IsInFtn(); diff --git a/sw/source/core/crsr/trvltbl.cxx b/sw/source/core/crsr/trvltbl.cxx index c1d1e00e2e03..7bd158d3be87 100644 --- a/sw/source/core/crsr/trvltbl.cxx +++ b/sw/source/core/crsr/trvltbl.cxx @@ -194,7 +194,7 @@ sal_Bool SwCrsrShell::_SelTblRowOrCol( bool bRow, bool bRowSimple ) const SwShellCrsr *pCrsr = _GetCrsr(); const SwFrm* pStartFrm = pFrm; const SwCntntNode *pCNd = pCrsr->GetCntntNode( sal_False ); - const SwFrm* pEndFrm = pCNd ? pCNd->GetFrm( &pCrsr->GetMkPos() ) : 0; + const SwFrm* pEndFrm = pCNd ? pCNd->getLayoutFrm( GetLayout(), &pCrsr->GetMkPos() ) : 0; if ( bRow ) { @@ -381,7 +381,7 @@ bool lcl_FindNextCell( SwNodeIndex& rIdx, sal_Bool bInReadOnly ) if ( !pCNd ) return false; - SwCntntFrm* pFrm = pCNd->GetFrm(); + SwCntntFrm* pFrm = pCNd->getLayoutFrm( pCNd->GetDoc()->GetCurrentLayout() ); if ( 0 == pFrm || pCNd->FindTableNode() != pTblNd || (!bInReadOnly && pFrm->IsProtected() ) ) @@ -413,7 +413,7 @@ bool lcl_FindNextCell( SwNodeIndex& rIdx, sal_Bool bInReadOnly ) return false; // check if we have found a suitable table cell: - pFrm = pCNd->GetFrm(); + pFrm = pCNd->getLayoutFrm( pCNd->GetDoc()->GetCurrentLayout() ); if ( 0 != pFrm && pCNd->FindTableNode() == pTblNd && (bInReadOnly || !pFrm->IsProtected() ) ) @@ -455,7 +455,7 @@ bool lcl_FindPrevCell( SwNodeIndex& rIdx, sal_Bool bInReadOnly ) if ( !pCNd ) return false; - SwCntntFrm* pFrm = pCNd->GetFrm(); + SwCntntFrm* pFrm = pCNd->getLayoutFrm( pCNd->GetDoc()->GetCurrentLayout() ); if( 0 == pFrm || pCNd->FindTableNode() != pTblNd || (!bInReadOnly && pFrm->IsProtected() )) @@ -476,7 +476,7 @@ bool lcl_FindPrevCell( SwNodeIndex& rIdx, sal_Bool bInReadOnly ) if ( !pCNd ) return false; - pFrm = pCNd->GetFrm(); + pFrm = pCNd->getLayoutFrm( pCNd->GetDoc()->GetCurrentLayout() ); if( 0 != pFrm && pCNd->FindTableNode() == pTblNd && (bInReadOnly || !pFrm->IsProtected() ) ) @@ -747,7 +747,7 @@ String SwCrsrShell::GetBoxNms() const if( IsTableMode() ) { SwCntntNode *pCNd = pTblCrsr->Start()->nNode.GetNode().GetCntntNode(); - pFrm = pCNd ? pCNd->GetFrm() : 0; + pFrm = pCNd ? pCNd->getLayoutFrm( GetLayout() ) : 0; if( !pFrm ) return sNm; @@ -769,7 +769,7 @@ String SwCrsrShell::GetBoxNms() const } SwCntntNode* pCNd = pPos->nNode.GetNode().GetCntntNode(); - pFrm = pCNd ? pCNd->GetFrm() : 0; + pFrm = pCNd ? pCNd->getLayoutFrm( GetLayout() ) : 0; if( pFrm ) { diff --git a/sw/source/core/crsr/unocrsr.cxx b/sw/source/core/crsr/unocrsr.cxx index 48bb4b1f2cf4..6adb1e14dfa7 100644 --- a/sw/source/core/crsr/unocrsr.cxx +++ b/sw/source/core/crsr/unocrsr.cxx @@ -48,14 +48,6 @@ SwUnoCrsr::SwUnoCrsr( const SwPosition &rPos, SwPaM* pRing ) {} -// @@@ semantic: no copy ctor. -SwUnoCrsr::SwUnoCrsr( SwUnoCrsr& rICrsr ) - : SwCursor( rICrsr ), SwModify( 0 ), - bRemainInSection( rICrsr.bRemainInSection ), - bSkipOverHiddenSections( rICrsr.bSkipOverHiddenSections ), - bSkipOverProtectSections( rICrsr.bSkipOverProtectSections ) -{} - SwUnoCrsr::~SwUnoCrsr() { SwDoc* pDoc = GetDoc(); @@ -245,9 +237,9 @@ void SwUnoTableCrsr::MakeBoxSels() const SwCntntNode* pCNd; bool bMakeTblCrsrs = true; if( GetPoint()->nNode.GetIndex() && GetMark()->nNode.GetIndex() && - 0 != ( pCNd = GetCntntNode() ) && pCNd->GetFrm() && - 0 != ( pCNd = GetCntntNode(sal_False) ) && pCNd->GetFrm() ) - bMakeTblCrsrs = GetDoc()->GetRootFrm()->MakeTblCrsrs( *this ); + 0 != ( pCNd = GetCntntNode() ) && pCNd->getLayoutFrm( pCNd->GetDoc()->GetCurrentLayout() ) && + 0 != ( pCNd = GetCntntNode(sal_False) ) && pCNd->getLayoutFrm( pCNd->GetDoc()->GetCurrentLayout() ) ) + bMakeTblCrsrs = GetDoc()->GetCurrentLayout()->MakeTblCrsrs( *this ); if ( !bMakeTblCrsrs ) { diff --git a/sw/source/core/crsr/viscrs.cxx b/sw/source/core/crsr/viscrs.cxx index 251e4d7fc23b..2f333f708486 100644 --- a/sw/source/core/crsr/viscrs.cxx +++ b/sw/source/core/crsr/viscrs.cxx @@ -215,7 +215,7 @@ void SwVisCrsr::_SetPosAndShow() if( rNode.IsTxtNode() ) { const SwTxtNode& rTNd = *rNode.GetTxtNode(); - const SwFrm* pFrm = rTNd.GetFrm( 0, 0, sal_False ); + const SwFrm* pFrm = rTNd.getLayoutFrm( pCrsrShell->GetLayout(), 0, 0, sal_False ); if ( pFrm ) { const SwScriptInfo* pSI = ((SwTxtFrm*)pFrm)->GetScriptInfo(); @@ -497,11 +497,11 @@ void SwShellCrsr::FillRects() // calculate the new rectangles if( HasMark() && GetPoint()->nNode.GetNode().IsCntntNode() && - GetPoint()->nNode.GetNode().GetCntntNode()->GetFrm() && + GetPoint()->nNode.GetNode().GetCntntNode()->getLayoutFrm( GetShell()->GetLayout() ) && (GetMark()->nNode == GetPoint()->nNode || (GetMark()->nNode.GetNode().IsCntntNode() && - GetMark()->nNode.GetNode().GetCntntNode()->GetFrm() ) )) - GetDoc()->GetRootFrm()->CalcFrmRects( *this, GetShell()->IsTableMode() ); + GetMark()->nNode.GetNode().GetCntntNode()->getLayoutFrm( GetShell()->GetLayout() ) ) )) + GetShell()->GetLayout()->CalcFrmRects( *this, GetShell()->IsTableMode() ); //swmod 071107//swmod 071225 } @@ -563,7 +563,7 @@ short SwShellCrsr::MaxReplaceArived() // a SSelection can be created. SvUShorts aArr; sal_uInt16 nActCnt; - ViewShell *pShell = GetDoc()->GetRootFrm()->GetCurrShell(), + ViewShell *pShell = const_cast< SwCrsrShell* >( GetShell() ), *pSh = pShell; do { for( nActCnt = 0; pSh->ActionPend(); ++nActCnt ) @@ -580,7 +580,7 @@ short SwShellCrsr::MaxReplaceArived() for( nActCnt = aArr[n]; nActCnt--; ) pSh->StartAction(); pSh = (ViewShell*)pSh->GetNext(); - } + } //swmod 071107//swmod 071225 } else // otherwise from the Basic, and than switch to RET_YES @@ -693,7 +693,7 @@ void SwShellTableCrsr::FillRects() if( !pCNd ) continue; - SwFrm* pFrm = pCNd->GetFrm( &GetSttPos() ); + SwFrm* pFrm = pCNd->getLayoutFrm( GetShell()->GetLayout(), &GetSttPos() ); while( pFrm && !pFrm->IsCellFrm() ) pFrm = pFrm->GetUpper(); @@ -729,7 +729,7 @@ sal_Bool SwShellTableCrsr::IsInside( const Point& rPt ) const if( !pCNd ) continue; - SwFrm* pFrm = pCNd->GetFrm( &GetPtPos() ); + SwFrm* pFrm = pCNd->getLayoutFrm( GetShell()->GetLayout(), &GetPtPos() ); while( pFrm && !pFrm->IsCellFrm() ) pFrm = pFrm->GetUpper(); OSL_ENSURE( pFrm, "Node nicht in einer Tabelle" ); diff --git a/sw/source/core/doc/acmplwrd.cxx b/sw/source/core/doc/acmplwrd.cxx index b597117315a9..ec5c65332b1c 100644 --- a/sw/source/core/doc/acmplwrd.cxx +++ b/sw/source/core/doc/acmplwrd.cxx @@ -65,11 +65,12 @@ public: SwAutoCompleteClient& operator=(const SwAutoCompleteClient& rClient); - virtual void Modify( SfxPoolItem *pOld, SfxPoolItem *pNew); const SwDoc& GetDoc(){return *pDoc;} #if OSL_DEBUG_LEVEL > 1 static sal_uLong GetElementCount() {return nSwAutoCompleteClientCount;} #endif +protected: + virtual void Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew); }; typedef std::vector<SwAutoCompleteClient> SwAutoCompleteClientVector; @@ -142,13 +143,13 @@ SwAutoCompleteClient& SwAutoCompleteClient::operator=(const SwAutoCompleteClient pAutoCompleteWord = rClient.pAutoCompleteWord; pDoc = rClient.pDoc; if(rClient.GetRegisteredIn()) - rClient.pRegisteredIn->Add(this); + ((SwModify*)rClient.GetRegisteredIn())->Add(this); else if(GetRegisteredIn()) - pRegisteredIn->Remove(this); + GetRegisteredInNonConst()->Remove(this); return *this; } -void SwAutoCompleteClient::Modify(SfxPoolItem *pOld, SfxPoolItem *) +void SwAutoCompleteClient::Modify( const SfxPoolItem* pOld, const SfxPoolItem *) { switch( pOld ? pOld->Which() : 0 ) { diff --git a/sw/source/core/doc/doc.cxx b/sw/source/core/doc/doc.cxx index 18fafac8331f..a031aa86098f 100644 --- a/sw/source/core/doc/doc.cxx +++ b/sw/source/core/doc/doc.cxx @@ -112,11 +112,14 @@ #include <SwUndoFmt.hxx> #include <unocrsr.hxx> #include <docsh.hxx> +#include <viewopt.hxx> #include <docfld.hxx> // _SetGetExpFld #include <docufld.hxx> // SwPostItField #include <viewsh.hxx> #include <shellres.hxx> #include <txtfrm.hxx> +#include <attrhint.hxx> + #include <wdocsh.hxx> // SwWebDocShell #include <prtopt.hxx> // SwPrintOptions @@ -127,6 +130,8 @@ #include <osl/interlck.h> #include <vbahelper/vbaaccesshelper.hxx> +#include "switerator.hxx" + /* @@@MAINTAINABILITY-HORROR@@@ Probably unwanted dependency on SwDocShell */ @@ -197,7 +202,7 @@ bool SwDoc::get(/*[in]*/ DocumentSettingId id) const case INVERT_BORDER_SPACING: return mbInvertBorderSpacing; case COLLAPSE_EMPTY_CELL_PARA: return mbCollapseEmptyCellPara; - case BROWSE_MODE: return mbBrowseMode; + case BROWSE_MODE: return mbLastBrowseMode; // Attention: normally the ViewShell has to be asked! case HTML_MODE: return mbHTMLMode; case GLOBAL_DOCUMENT: return mbIsGlobalDoc; case GLOBAL_DOCUMENT_SAVE_LINKS: return mbGlblDocSaveLinks; @@ -328,8 +333,8 @@ void SwDoc::set(/*[in]*/ DocumentSettingId id, /*[in]*/ bool value) break; // COMPATIBILITY FLAGS END - case BROWSE_MODE: - mbBrowseMode = value; + case BROWSE_MODE: //can be used temporary (load/save) when no ViewShell is avaiable + mbLastBrowseMode = value; break; case HTML_MODE: @@ -379,7 +384,7 @@ const i18n::ForbiddenCharacters* } void SwDoc::setForbiddenCharacters(/*[in]*/ sal_uInt16 nLang, - /*[in]*/ const i18n::ForbiddenCharacters& rFChars ) + /*[in]*/ const com::sun::star::i18n::ForbiddenCharacters& rFChars ) { if( !xForbiddenCharsTable.is() ) { @@ -396,12 +401,14 @@ void SwDoc::setForbiddenCharacters(/*[in]*/ sal_uInt16 nLang, pDrawModel->ReformatAllTextObjects(); } - if( pLayout && !mbInReading ) + SwRootFrm* pTmpRoot = GetCurrentLayout(); + if( pTmpRoot && !mbInReading ) { - pLayout->StartAllAction(); - pLayout->InvalidateAllCntnt(); - pLayout->EndAllAction(); - } + pTmpRoot->StartAllAction(); + std::set<SwRootFrm*> aAllLayouts = GetAllLayouts(); + std::for_each( aAllLayouts.begin(), aAllLayouts.end(), std::bind2nd(std::mem_fun(&SwRootFrm::InvalidateAllCntnt), INV_SIZE)); + pTmpRoot->EndAllAction(); + }//swmod 080310 SetModified(); } @@ -465,12 +472,14 @@ void SwDoc::setCharacterCompressionType( /*[in]*/SwCharCompressType n ) pDrawModel->ReformatAllTextObjects(); } - if( pLayout && !mbInReading ) + SwRootFrm* pTmpRoot = GetCurrentLayout(); + if( pTmpRoot && !mbInReading ) { - pLayout->StartAllAction(); - pLayout->InvalidateAllCntnt(); - pLayout->EndAllAction(); - } + pTmpRoot->StartAllAction(); + std::set<SwRootFrm*> aAllLayouts = GetAllLayouts(); + std::for_each( aAllLayouts.begin(), aAllLayouts.end(), std::bind2nd(std::mem_fun(&SwRootFrm::InvalidateAllCntnt), INV_SIZE)); + pTmpRoot->EndAllAction(); + }//swmod 080310 SetModified(); } } @@ -1087,9 +1096,8 @@ sal_uInt16 _PostItFld::GetPageNo( //Bereichs ermittelt werden. rVirtPgNo = 0; sal_uInt16 nPos = GetCntnt(); - SwClientIter aIter( (SwModify &)GetFld()->GetTxtNode() ); - for( SwTxtFrm* pFrm = (SwTxtFrm*)aIter.First( TYPE( SwFrm )); - pFrm; pFrm = (SwTxtFrm*)aIter.Next() ) + SwIterator<SwTxtFrm,SwTxtNode> aIter( GetFld()->GetTxtNode() ); + for( SwTxtFrm* pFrm = aIter.First(); pFrm; pFrm = aIter.Next() ) { if( pFrm->GetOfst() > nPos || (pFrm->HasFollow() && pFrm->GetFollow()->GetOfst() <= nPos) ) @@ -1118,13 +1126,11 @@ bool lcl_GetPostIts( if( pFldType->GetDepends() ) { // Modify-Object gefunden, trage alle Felder ins Array ein - SwClientIter aIter( *pFldType ); - SwClient* pLast; + SwIterator<SwFmtFld,SwFieldType> aIter( *pFldType ); const SwTxtFld* pTxtFld; - - for( pLast = aIter.First( TYPE(SwFmtFld)); pLast; pLast = aIter.Next() ) + for( SwFmtFld* pFld = aIter.First(); pFld; pFld = aIter.Next() ) { - if( 0 != ( pTxtFld = ((SwFmtFld*)pLast)->GetTxtFld() ) && + if( 0 != ( pTxtFld = pFld->GetTxtFld() ) && pTxtFld->GetTxtNode().GetNodes().IsDocNodes() ) { bHasPostIts = true; @@ -1212,15 +1218,12 @@ static sal_Int32 lcl_GetPaperBin( const SwPageFrm *pStartFrm ) } void SwDoc::CalculatePagesForPrinting( + const SwRootFrm& rLayout, /* out */ SwRenderData &rData, const SwPrintUIOptions &rOptions, bool bIsPDFExport, sal_Int32 nDocPageCount ) { - DBG_ASSERT( pLayout, "no layout present" ); - if (!pLayout) - return; - const sal_Int32 nContent = rOptions.getIntValue( "PrintContent", 0 ); const bool bPrintSelection = nContent == 2; @@ -1237,7 +1240,7 @@ void SwDoc::CalculatePagesForPrinting( aMulti.SetTotalRange( Range( 0, RANGE_MAX ) ); aMulti.Select( aPages ); - const SwPageFrm *pStPage = (SwPageFrm*)pLayout->Lower(); + const SwPageFrm *pStPage = dynamic_cast<const SwPageFrm*>( rLayout.Lower() ); const SwFrm *pEndPage = pStPage; sal_uInt16 nFirstPageNo = 0; @@ -1427,7 +1430,7 @@ void SwDoc::UpdatePagesForPrintingWithPostItData( { // get the correct number of current pages for the post-it document rData.m_pPostItShell->CalcLayout(); - const sal_Int32 nPages = rData.m_pPostItDoc->GetPageCount(); + const sal_Int32 nPages = rData.m_pPostItShell->GetPageCount(); aPostItLastStartPageNum[ nPhyPageNum ] = nPages; } } @@ -1435,7 +1438,7 @@ void SwDoc::UpdatePagesForPrintingWithPostItData( // format post-it doc to get correct number of pages rData.m_pPostItShell->CalcLayout(); - const sal_Int32 nPostItDocPageCount = rData.m_pPostItDoc->GetPageCount(); + const sal_Int32 nPostItDocPageCount = rData.m_pPostItShell->GetPageCount(); if (nPostItMode == POSTITS_ONLY || nPostItMode == POSTITS_ENDDOC) { @@ -1553,6 +1556,7 @@ void SwDoc::UpdatePagesForPrintingWithPostItData( } void SwDoc::CalculatePagePairsForProspectPrinting( + const SwRootFrm& rLayout, /* out */ SwRenderData &rData, const SwPrintUIOptions &rOptions, sal_Int32 nDocPageCount ) @@ -1581,11 +1585,10 @@ void SwDoc::CalculatePagePairsForProspectPrinting( } StringRangeEnumerator aRange( aPageRange, 1, nDocPageCount, 0 ); - DBG_ASSERT( pLayout, "no layout present" ); - if (!pLayout || aRange.size() <= 0) + if ( aRange.size() <= 0) return; - const SwPageFrm *pStPage = (SwPageFrm*)pLayout->Lower(); + const SwPageFrm *pStPage = dynamic_cast<const SwPageFrm*>( rLayout.Lower() ); sal_Int32 i = 0; for ( i = 1; pStPage && i < nDocPageCount; ++i ) pStPage = (SwPageFrm*)pStPage->GetNext(); @@ -1595,7 +1598,7 @@ void SwDoc::CalculatePagePairsForProspectPrinting( // currently for prospect printing all pages are valid to be printed // thus we add them all to the respective map and set for later use sal_Int32 nPageNum = 0; - const SwPageFrm *pPageFrm = (SwPageFrm*)pLayout->Lower(); + const SwPageFrm *pPageFrm = dynamic_cast<const SwPageFrm*>( rLayout.Lower() ); while( pPageFrm && nPageNum < nDocPageCount ) { DBG_ASSERT( pPageFrm, "Empty page frame. How are we going to print this?" ); @@ -1698,36 +1701,6 @@ void SwDoc::CalculatePagePairsForProspectPrinting( // thus we are done here. } -sal_uInt16 SwDoc::GetPageCount() const -{ - return GetRootFrm() ? GetRootFrm()->GetPageNum() : 0; -} - -const Size SwDoc::GetPageSize( sal_uInt16 nPageNum, bool bSkipEmptyPages ) const -{ - Size aSize; - if ( GetRootFrm() && nPageNum ) - { - const SwPageFrm* pPage = static_cast<const SwPageFrm*> - (GetRootFrm()->Lower()); - - while ( --nPageNum && pPage->GetNext() ) - { - pPage = static_cast<const SwPageFrm*>( pPage->GetNext() ); - } - - // switch to next page for an empty page, if empty pages are not skipped - // in order to get a sensible page size for an empty page - e.g. for printing. - if ( !bSkipEmptyPages && pPage->IsEmptyPage() && pPage->GetNext() ) - { - pPage = static_cast<const SwPageFrm*>( pPage->GetNext() ); - } - - aSize = pPage->Frm().SSize(); - } - return aSize; -} - /************************************************************************* * void UpdateDocStat( const SwDocStat& rStat ); *************************************************************************/ @@ -1756,10 +1729,8 @@ void SwDoc::UpdateDocStat( SwDocStat& rStat ) // #i93174#: notes contain paragraphs that are not nodes { SwFieldType * const pPostits( GetSysFldType(RES_POSTITFLD) ); - SwClientIter aIter(*pPostits); - SwFmtFld const * pFmtFld = - static_cast<SwFmtFld const*>(aIter.First( TYPE(SwFmtFld) )); - while (pFmtFld) + SwIterator<SwFmtFld,SwFieldType> aIter( *pPostits ); + for( SwFmtFld* pFmtFld = aIter.First(); pFmtFld; pFmtFld = aIter.Next() ) { if (pFmtFld->IsFldInDoc()) { @@ -1767,11 +1738,10 @@ void SwDoc::UpdateDocStat( SwDocStat& rStat ) static_cast<SwPostItField const*>(pFmtFld->GetFld())); rStat.nAllPara += pField->GetNumberOfParagraphs(); } - pFmtFld = static_cast<SwFmtFld const*>(aIter.Next()); } } - rStat.nPage = GetRootFrm() ? GetRootFrm()->GetPageNum() : 0; + rStat.nPage = GetCurrentLayout() ? GetCurrentLayout()->GetPageNum() : 0; //swmod 080218 rStat.bModified = sal_False; SetDocStat( rStat ); @@ -2071,46 +2041,35 @@ sal_Bool lcl_CheckSmartTagsAgain( const SwNodePtr& rpNd, void* ) ************************************************************************/ void SwDoc::SpellItAgainSam( sal_Bool bInvalid, sal_Bool bOnlyWrong, sal_Bool bSmartTags ) { - OSL_ENSURE( GetRootFrm(), "SpellAgain: Where's my RootFrm?" ); + std::set<SwRootFrm*> aAllLayouts = GetAllLayouts();//swmod 080307 + OSL_ENSURE( GetCurrentLayout(), "SpellAgain: Where's my RootFrm?" ); if( bInvalid ) { - SwPageFrm *pPage = (SwPageFrm*)GetRootFrm()->Lower(); - while ( pPage ) - { - if ( bSmartTags ) - pPage->InvalidateSmartTags(); - - pPage->InvalidateSpelling(); - pPage = (SwPageFrm*)pPage->GetNext(); - } - GetRootFrm()->SetNeedGrammarCheck( true ); - + std::for_each( aAllLayouts.begin(), aAllLayouts.end(),std::bind2nd(std::mem_fun(&SwRootFrm::AllInvalidateSmartTagsOrSpelling),bSmartTags));//swmod 080305 + std::for_each( aAllLayouts.begin(), aAllLayouts.end(),std::bind2nd(std::mem_fun(&SwRootFrm::SetNeedGrammarCheck), true) ); if ( bSmartTags ) GetNodes().ForEach( lcl_CheckSmartTagsAgain, &bOnlyWrong ); - GetNodes().ForEach( lcl_SpellAndGrammarAgain, &bOnlyWrong ); } - GetRootFrm()->SetIdleFlags(); + std::for_each( aAllLayouts.begin(), aAllLayouts.end(),std::mem_fun(&SwRootFrm::SetIdleFlags));//swmod 080307 } void SwDoc::InvalidateAutoCompleteFlag() { - if( GetRootFrm() ) + SwRootFrm* pTmpRoot = GetCurrentLayout(); + if( pTmpRoot ) { - SwPageFrm *pPage = (SwPageFrm*)GetRootFrm()->Lower(); - while ( pPage ) - { - pPage->InvalidateAutoCompleteWords(); - pPage = (SwPageFrm*)pPage->GetNext(); - } + std::set<SwRootFrm*> aAllLayouts = GetAllLayouts(); + std::for_each( aAllLayouts.begin(), aAllLayouts.end(),std::mem_fun(&SwRootFrm::AllInvalidateAutoCompleteWords));//swmod 080305 for( sal_uLong nNd = 1, nCnt = GetNodes().Count(); nNd < nCnt; ++nNd ) { SwTxtNode* pTxtNode = GetNodes()[ nNd ]->GetTxtNode(); if ( pTxtNode ) pTxtNode->SetAutoCompleteWordDirty( true ); } - GetRootFrm()->SetIdleFlags(); - } + + std::for_each( aAllLayouts.begin(), aAllLayouts.end(),std::mem_fun(&SwRootFrm::SetIdleFlags));//swmod 080228 + } //swmod 080219 } const SwFmtINetFmt* SwDoc::FindINetAttr( const String& rName ) const @@ -2215,9 +2174,8 @@ bool SwDoc::RemoveInvisibleContent() { SwTxtNode* pTxtNd; - SwClientIter aIter( *GetSysFldType( RES_HIDDENPARAFLD ) ); - for( SwFmtFld* pFmtFld = (SwFmtFld*)aIter.First( TYPE( SwFmtFld )); - pFmtFld; pFmtFld = (SwFmtFld*)aIter.Next() ) + SwIterator<SwFmtFld,SwFieldType> aIter( *GetSysFldType( RES_HIDDENPARAFLD ) ); + for( SwFmtFld* pFmtFld = aIter.First(); pFmtFld; pFmtFld = aIter.Next() ) { if( pFmtFld->GetTxtFld() && 0 != ( pTxtNd = (SwTxtNode*)pFmtFld->GetTxtFld()->GetpTxtNode() ) && @@ -2456,14 +2414,11 @@ sal_Bool SwDoc::ConvertFieldsToText() if ( RES_POSTITFLD == pCurType->Which() ) continue; - SwClientIter aIter( *(SwFieldType*)pCurType ); - const SwFmtFld* pCurFldFmt = (SwFmtFld*)aIter.First( TYPE( SwFmtFld )); + SwIterator<SwFmtFld,SwFieldType> aIter( *pCurType ); ::std::vector<const SwFmtFld*> aFieldFmts; - while (pCurFldFmt) - { + for( SwFmtFld* pCurFldFmt = aIter.First(); pCurFldFmt; pCurFldFmt = aIter.Next() ) aFieldFmts.push_back(pCurFldFmt); - pCurFldFmt = (SwFmtFld*)aIter.Next(); - } + ::std::vector<const SwFmtFld*>::iterator aBegin = aFieldFmts.begin(); ::std::vector<const SwFmtFld*>::iterator aEnd = aFieldFmts.end(); while(aBegin != aEnd) @@ -2744,21 +2699,8 @@ void SwDoc::ChkCondColls() for (sal_uInt16 n = 0; n < pTxtFmtCollTbl->Count(); n++) { SwTxtFmtColl *pColl = (*pTxtFmtCollTbl)[n]; - if (RES_CONDTXTFMTCOLL == pColl->Which()) - { - SwClientIter aIter(*pColl); - - SwClient * pClient = aIter.First(TYPE(SwTxtNode)); - while (pClient) - { - SwTxtNode * pTxtNode = static_cast<SwTxtNode *>(pClient); - - pTxtNode->ChkCondColl(); - - pClient = aIter.Next(); - } - } + pColl->CallSwClientNotify( SwAttrHint(RES_CONDTXTFMTCOLL) ); } } diff --git a/sw/source/core/doc/docbm.cxx b/sw/source/core/doc/docbm.cxx index 5a0b377ee5d4..85a90d2565e3 100644 --- a/sw/source/core/doc/docbm.cxx +++ b/sw/source/core/doc/docbm.cxx @@ -1277,7 +1277,7 @@ void _SaveCntntIdx(SwDoc* pDoc, if( pNode ) { - SwFrm* pFrm = pNode->GetFrm(); + SwFrm* pFrm = pNode->getLayoutFrm( pDoc->GetCurrentLayout() ); #if OSL_DEBUG_LEVEL > 1 static sal_Bool bViaDoc = sal_False; if( bViaDoc ) @@ -1481,7 +1481,7 @@ void _RestoreCntntIdx(SwDoc* pDoc, { SwFrmFmt *pFrmFmt = (*pSpz)[ aSave.GetCount() ]; SfxPoolItem *pAnchor = (SfxPoolItem*)&pFrmFmt->GetAnchor(); - pFrmFmt->SwModify::Modify( pAnchor, pAnchor ); + pFrmFmt->NotifyClients( pAnchor, pAnchor ); } break; diff --git a/sw/source/core/doc/docchart.cxx b/sw/source/core/doc/docchart.cxx index 78fafdf4d15d..7297413eb239 100644 --- a/sw/source/core/doc/docchart.cxx +++ b/sw/source/core/doc/docchart.cxx @@ -132,7 +132,7 @@ IMPL_LINK( SwDoc, DoUpdateAllCharts, Timer *, EMPTYARG ) return 0; } -void SwDoc::_UpdateCharts( const SwTable& rTbl, ViewShell& /*rVSh*/ ) const +void SwDoc::_UpdateCharts( const SwTable& rTbl, ViewShell& rVSh ) const { String aName( rTbl.GetFrmFmt()->GetName() ); SwOLENode *pONd; @@ -144,7 +144,7 @@ void SwDoc::_UpdateCharts( const SwTable& rTbl, ViewShell& /*rVSh*/ ) const SwFrm* pFrm; if( 0 != ( pONd = aIdx.GetNode().GetOLENode() ) && aName.Equals( pONd->GetChartTblName() ) && - 0 != ( pFrm = pONd->GetFrm() ) ) + 0 != ( pFrm = pONd->getLayoutFrm( rVSh.GetLayout() ) ) ) { SwChartDataProvider *pPCD = GetChartDataProvider(); if (pPCD) @@ -248,7 +248,7 @@ void SwDoc::CreateChartInternalDataProviders( const SwTable *pTable ) aIdx++; if( 0 != ( pONd = aIdx.GetNode().GetOLENode() ) && aName.Equals( pONd->GetChartTblName() ) /* OLE node is chart? */ && - 0 != (pONd->GetFrm()) /* chart frame is not hidden */ ) + 0 != (pONd->getLayoutFrm( GetCurrentLayout() )) /* chart frame is not hidden */ ) { uno::Reference < embed::XEmbeddedObject > xIP = pONd->GetOLEObj().GetOleRef(); if ( svt::EmbeddedObjectRef::TryRunningState( xIP ) ) diff --git a/sw/source/core/doc/doccorr.cxx b/sw/source/core/doc/doccorr.cxx index d13affa1c536..8f59503b2455 100644 --- a/sw/source/core/doc/doccorr.cxx +++ b/sw/source/core/doc/doccorr.cxx @@ -44,8 +44,6 @@ #include <swundo.hxx> #include <hints.hxx> -/* */ - /* * MACROS um ueber alle CrsrShells zu iterieren */ @@ -193,7 +191,7 @@ void PaMCorrAbs( const SwPaM& rRange, { // the UNO cursor has left its section. We need to notify it! SwMsgPoolItem aHint( RES_UNOCURSOR_LEAVES_SECTION ); - pUnoCursor->Modify( &aHint, NULL ); + pUnoCursor->ModifyNotification( &aHint, NULL ); } } } @@ -335,9 +333,9 @@ void SwDoc::CorrRel(const SwNodeIndex& rOldNode, SwEditShell* SwDoc::GetEditShell( ViewShell** ppSh ) const { // Layout und OLE-Shells sollten vorhanden sein! - if( pLayout && pLayout->GetCurrShell() ) + if( pCurrentView ) { - ViewShell *pSh = pLayout->GetCurrShell(), *pVSh = pSh; + ViewShell *pSh = pCurrentView, *pVSh = pSh; if( ppSh ) *ppSh = pSh; @@ -349,7 +347,7 @@ SwEditShell* SwDoc::GetEditShell( ViewShell** ppSh ) const } while( pVSh != ( pSh = (ViewShell*)pSh->GetNext() )); } else if( ppSh ) - *ppSh = 0; + *ppSh = 0; //swmod 071029//swmod 071225 return 0; } diff --git a/sw/source/core/doc/docdesc.cxx b/sw/source/core/doc/docdesc.cxx index 30adf7eb721a..6133185a6b7a 100644 --- a/sw/source/core/doc/docdesc.cxx +++ b/sw/source/core/doc/docdesc.cxx @@ -71,10 +71,10 @@ #include <GetMetricVal.hxx> #include <unotools/syslocale.hxx> #include <statstr.hrc> +#include <switerator.hxx> #include <hints.hxx> - #include <SwUndoPageDesc.hxx> - +#include <pagedeschint.hxx> #include <tgrditem.hxx> using namespace com::sun::star; @@ -199,6 +199,7 @@ void SwDoc::ChgPageDesc( sal_uInt16 i, const SwPageDesc &rChged ) OSL_ENSURE( i < aPageDescs.Count(), "PageDescs ueberindiziert." ); SwPageDesc *pDesc = aPageDescs[i]; + SwRootFrm* pTmpRoot = GetCurrentLayout();//swmod 080219 if (GetIDocumentUndoRedo().DoesUndo()) { @@ -394,9 +395,12 @@ void SwDoc::ChgPageDesc( sal_uInt16 i, const SwPageDesc &rChged ) } } - if ( (bUseOn || bFollow) && GetRootFrm() ) + if ( (bUseOn || bFollow) && pTmpRoot) //Layot benachrichtigen! - GetRootFrm()->CheckPageDescs( (SwPageFrm*)GetRootFrm()->Lower() ); + { + std::set<SwRootFrm*> aAllLayouts = GetAllLayouts(); + std::for_each( aAllLayouts.begin(), aAllLayouts.end(),std::mem_fun(&SwRootFrm::AllCheckPageDescs));//swmod 080304 + } //Jetzt noch die Seiten-Attribute uebernehmen. ::lcl_DescSetAttr( rChged.GetMaster(), pDesc->GetMaster() ); @@ -409,16 +413,10 @@ void SwDoc::ChgPageDesc( sal_uInt16 i, const SwPageDesc &rChged ) pDesc->SetFtnInfo( rChged.GetFtnInfo() ); SwMsgPoolItem aInfo( RES_PAGEDESC_FTNINFO ); { - SwClientIter aIter( pDesc->GetMaster() ); - for( SwClient* pLast = aIter.First(TYPE(SwFrm)); pLast; - pLast = aIter.Next() ) - pLast->Modify( &aInfo, 0 ); + pDesc->GetMaster().ModifyBroadcast( &aInfo, 0, TYPE(SwFrm) ); } { - SwClientIter aIter( pDesc->GetLeft() ); - for( SwClient* pLast = aIter.First(TYPE(SwFrm)); pLast; - pLast = aIter.Next() ) - pLast->Modify( &aInfo, 0 ); + pDesc->GetLeft().ModifyBroadcast( &aInfo, 0, TYPE(SwFrm) ); } } SetModified(); @@ -439,62 +437,33 @@ void SwDoc::ChgPageDesc( sal_uInt16 i, const SwPageDesc &rChged ) |* |*************************************************************************/ -void lcl_RemoveFrms( SwFrmFmt& rFmt, sal_Bool& rbFtnsRemoved ) -{ - SwClientIter aIter( rFmt ); - SwFrm *pFrm; - for( pFrm = (SwFrm*)aIter.First(TYPE(SwFrm)); pFrm; - pFrm = (SwFrm*)aIter.Next() ) - if ( !rbFtnsRemoved && pFrm->IsPageFrm() && - ((SwPageFrm*)pFrm)->IsFtnPage() ) - { - rFmt.getIDocumentLayoutAccess()->GetRootFrm()->RemoveFtns( 0, sal_False, sal_True ); - rbFtnsRemoved = sal_True; - } - else - { - pFrm->Cut(); - delete pFrm; - } -} - // #i7983# void SwDoc::PreDelPageDesc(SwPageDesc * pDel) { if (0 == pDel) return; - SwFmtPageDesc aDfltDesc( aPageDescs[0] ); - SwClientIter aIter( *pDel ); - SwClient* pLast; - while( 0 != ( pLast = aIter.GoRoot() )) + // mba: test iteration as clients are removed while iteration + SwPageDescHint aHint( aPageDescs[0] ); + pDel->CallSwClientNotify( aHint ); + + bool bHasLayout = HasLayout(); + if ( pFtnInfo->DependsOn( pDel ) ) { - if( pLast->ISA( SwFmtPageDesc ) ) + pFtnInfo->ChgPageDesc( aPageDescs[0] ); + if ( bHasLayout ) { - const SwModify* pMod = ((SwFmtPageDesc*)pLast)->GetDefinedIn(); - if ( pMod ) - { - if( pMod->ISA( SwCntntNode ) ) - ((SwCntntNode*)pMod)->SetAttr( aDfltDesc ); - else if( pMod->ISA( SwFmt )) - ((SwFmt*)pMod)->SetFmtAttr( aDfltDesc ); - else - { - OSL_ENSURE( !this, "was ist das fuer ein Mofify-Obj?" ); - aPageDescs[0]->Add( pLast ); - } - } - else //Es kann noch eine Undo-Kopie existieren - aPageDescs[0]->Add( pLast ); + std::set<SwRootFrm*> aAllLayouts = GetAllLayouts(); + std::for_each( aAllLayouts.begin(), aAllLayouts.end(),std::bind2nd(std::mem_fun(&SwRootFrm::CheckFtnPageDescs), false)); } - - sal_Bool bFtnInf = sal_False; - if ( sal_True == (bFtnInf = pLast == pFtnInfo->GetPageDescDep()) || - pLast == pEndNoteInfo->GetPageDescDep() ) + } + else if ( pEndNoteInfo->DependsOn( pDel ) ) + { + pEndNoteInfo->ChgPageDesc( aPageDescs[0] ); + if ( bHasLayout ) { - aPageDescs[0]->Add( pLast ); - if ( GetRootFrm() ) - GetRootFrm()->CheckFtnPageDescs( !bFtnInf ); + std::set<SwRootFrm*> aAllLayouts = GetAllLayouts(); + std::for_each( aAllLayouts.begin(), aAllLayouts.end(),std::bind2nd(std::mem_fun(&SwRootFrm::CheckFtnPageDescs), true)); } } @@ -503,29 +472,13 @@ void SwDoc::PreDelPageDesc(SwPageDesc * pDel) if ( aPageDescs[j]->GetFollow() == pDel ) { aPageDescs[j]->SetFollow( 0 ); - //Clients des PageDesc sind die Attribute, denen sagen wir bescheid. - //die Attribute wiederum reichen die Meldung an die Absaetze weiter. - - //Layot benachrichtigen! - if( GetRootFrm() ) // ist nicht immer vorhanden!! (Orginizer) - GetRootFrm()->CheckPageDescs( (SwPageFrm*)GetRootFrm()->Lower() ); + if( bHasLayout ) + { + std::set<SwRootFrm*> aAllLayouts = GetAllLayouts(); + std::for_each( aAllLayouts.begin(), aAllLayouts.end(),std::mem_fun(&SwRootFrm::AllCheckPageDescs));//swmod 080228 + } } } - - if( GetRootFrm() ) // ist nicht immer vorhanden!! (Orginizer) - { - //Wenn jetzt noch irgendwelche Seiten auf die FrmFmt'e (Master und Left) - //Zeigen (z.B. irgendwelche Fussnotenseiten), so muessen die Seiten - //vernichtet werden. - - // Wenn wir auf Endnotenseiten stossen, schmeissen wir alle Fussnoten weg, - // anders kann die Reihenfolge der Seiten (FollowsPageDescs usw.) - // nicht garantiert werden. - sal_Bool bFtnsRemoved = sal_False; - - ::lcl_RemoveFrms( pDel->GetMaster(), bFtnsRemoved ); - ::lcl_RemoveFrms( pDel->GetLeft(), bFtnsRemoved ); - } } void SwDoc::BroadcastStyleOperation(String rName, SfxStyleFamily eFamily, @@ -653,7 +606,7 @@ void SwDoc::PrtDataChanged() OSL_ENSURE( get(IDocumentSettingAccess::USE_VIRTUAL_DEVICE) || 0 != getPrinter( sal_False ), "PrtDataChanged will be called recursive!" ); // <-- - + SwRootFrm* pTmpRoot = GetCurrentLayout();//swmod 080219 SwWait *pWait = 0; sal_Bool bEndAction = sal_False; @@ -661,16 +614,16 @@ void SwDoc::PrtDataChanged() GetDocShell()->UpdateFontList(); sal_Bool bDraw = sal_True; - if ( GetRootFrm() ) + if ( pTmpRoot ) { - ViewShell *pSh = GetRootFrm()->GetCurrShell(); - if( !get(IDocumentSettingAccess::BROWSE_MODE) || - ( pSh && pSh->GetViewOptions()->IsPrtFormat() ) ) + ViewShell *pSh = GetCurrentViewShell(); + if( !pSh->GetViewOptions()->getBrowseMode() || + pSh->GetViewOptions()->IsPrtFormat() ) { if ( GetDocShell() ) pWait = new SwWait( *GetDocShell(), sal_True ); - GetRootFrm()->StartAllAction(); + pTmpRoot->StartAllAction(); bEndAction = sal_True; bDraw = sal_False; @@ -681,7 +634,9 @@ void SwDoc::PrtDataChanged() } pFntCache->Flush(); - GetRootFrm()->InvalidateAllCntnt(); + + std::set<SwRootFrm*> aAllLayouts = GetAllLayouts(); + std::for_each( aAllLayouts.begin(), aAllLayouts.end(),std::bind2nd(std::mem_fun(&SwRootFrm::InvalidateAllCntnt), INV_SIZE));//swmod 080304 if ( pSh ) { @@ -690,11 +645,11 @@ void SwDoc::PrtDataChanged() pSh->InitPrt( pPrt ); pSh = (ViewShell*)pSh->GetNext(); } - while ( pSh != GetRootFrm()->GetCurrShell() ); + while ( pSh != GetCurrentViewShell() ); } } - } + } //swmod 080218 if ( bDraw && pDrawModel ) { const sal_Bool bTmpAddExtLeading = get(IDocumentSettingAccess::ADD_EXT_LEADING); @@ -709,7 +664,7 @@ void SwDoc::PrtDataChanged() PrtOLENotify( sal_True ); if ( bEndAction ) - GetRootFrm()->EndAllAction(); + pTmpRoot->EndAllAction(); //swmod 080218 delete pWait; } @@ -723,18 +678,18 @@ extern SvPtrarr *pGlobalOLEExcludeList; void SwDoc::PrtOLENotify( sal_Bool bAll ) { SwFEShell *pShell = 0; - if ( GetRootFrm() && GetRootFrm()->GetCurrShell() ) + if ( GetCurrentViewShell() ) { - ViewShell *pSh = GetRootFrm()->GetCurrShell(); + ViewShell *pSh = GetCurrentViewShell(); if ( !pSh->ISA(SwFEShell) ) do { pSh = (ViewShell*)pSh->GetNext(); } while ( !pSh->ISA(SwFEShell) && - pSh != GetRootFrm()->GetCurrShell() ); + pSh != GetCurrentViewShell() ); if ( pSh->ISA(SwFEShell) ) pShell = (SwFEShell*)pSh; - } + } //swmod 071107//swmod 071225 if ( !pShell ) { //Das hat ohne Shell und damit ohne Client keinen Sinn, weil nur darueber @@ -753,28 +708,12 @@ void SwDoc::PrtOLENotify( sal_Bool bAll ) mbOLEPrtNotifyPending = mbAllOLENotify = sal_False; - - SwOLENodes *pNodes = 0; - SwClientIter aIter( *(SwModify*)GetDfltGrfFmtColl() ); - for( SwCntntNode* pNd = (SwCntntNode*)aIter.First( TYPE( SwCntntNode ) ); - pNd; - pNd = (SwCntntNode*)aIter.Next() ) - { - SwOLENode *pONd; - if ( 0 != (pONd = pNd->GetOLENode()) && - (bAll || pONd->IsOLESizeInvalid()) ) - { - if ( !pNodes ) - pNodes = new SwOLENodes; - pNodes->Insert( pONd, pNodes->Count() ); - } - } - + SwOLENodes *pNodes = SwCntntNode::CreateOLENodesArray( *GetDfltGrfFmtColl(), !bAll ); if ( pNodes ) { ::StartProgress( STR_STATSTR_SWGPRTOLENOTIFY, 0, pNodes->Count(), GetDocShell()); - GetRootFrm()->StartAllAction(); + GetCurrentLayout()->StartAllAction(); //swmod 080218 for( sal_uInt16 i = 0; i < pNodes->Count(); ++i ) { @@ -817,7 +756,7 @@ void SwDoc::PrtOLENotify( sal_Bool bAll ) } } delete pNodes; - GetRootFrm()->EndAllAction(); + GetCurrentLayout()->EndAllAction(); //swmod 080218 ::EndProgress( GetDocShell() ); } } @@ -830,42 +769,31 @@ IMPL_LINK( SwDoc, DoUpdateModifiedOLE, Timer *, ) { mbOLEPrtNotifyPending = mbAllOLENotify = sal_False; - SwOLENodes aOLENodes; - SwClientIter aIter( *(SwModify*)GetDfltGrfFmtColl() ); - for( SwCntntNode* pNd = (SwCntntNode*)aIter.First( TYPE( SwCntntNode ) ); - pNd; - pNd = (SwCntntNode*)aIter.Next() ) - { - SwOLENode *pONd = pNd->GetOLENode(); - if( pONd && pONd->IsOLESizeInvalid() ) - { - aOLENodes.Insert( pONd, aOLENodes.Count() ); - } - } - - if( aOLENodes.Count() ) + SwOLENodes *pNodes = SwCntntNode::CreateOLENodesArray( *GetDfltGrfFmtColl(), true ); + if( pNodes ) { ::StartProgress( STR_STATSTR_SWGPRTOLENOTIFY, - 0, aOLENodes.Count(), GetDocShell()); - GetRootFrm()->StartAllAction(); + 0, pNodes->Count(), GetDocShell()); + GetCurrentLayout()->StartAllAction(); //swmod 080218 SwMsgPoolItem aMsgHint( RES_UPDATE_ATTR ); - for( sal_uInt16 i = 0; i < aOLENodes.Count(); ++i ) + for( sal_uInt16 i = 0; i < pNodes->Count(); ++i ) { ::SetProgressState( i, GetDocShell() ); - SwOLENode* pOLENd = aOLENodes[i]; + SwOLENode* pOLENd = (*pNodes)[i]; pOLENd->SetOLESizeInvalid( sal_False ); //Kennen wir nicht, also muss das Objekt geladen werden. //Wenn es keine Benachrichtigung wuenscht if( pOLENd->GetOLEObj().GetOleRef().is() ) //Kaputt? { - pOLENd->Modify( &aMsgHint, &aMsgHint ); + pOLENd->ModifyNotification( &aMsgHint, &aMsgHint ); } } - GetRootFrm()->EndAllAction(); + GetCurrentLayout()->EndAllAction(); //swmod 080218 ::EndProgress( GetDocShell() ); + delete pNodes; } } return 0; diff --git a/sw/source/core/doc/docdraw.cxx b/sw/source/core/doc/docdraw.cxx index a240afbf3dc6..bf2dcbbd93cb 100644 --- a/sw/source/core/doc/docdraw.cxx +++ b/sw/source/core/doc/docdraw.cxx @@ -66,16 +66,14 @@ #include <dflyobj.hxx> #include <svx/svdetc.hxx> #include <editeng/fhgtitem.hxx> - #include <svx/svdpagv.hxx> - #include <txtfrm.hxx> #include <editeng/frmdiritem.hxx> #include <fmtornt.hxx> - #include <svx/svditer.hxx> #include <vector> +#include <switerator.hxx> using namespace ::com::sun::star; using namespace ::com::sun::star::linguistic2; @@ -516,28 +514,29 @@ _ZSortFly::_ZSortFly( const SwFrmFmt* pFrmFmt, const SwFmtAnchor* pFlyAn, // #i11176# // This also needs to work when no layout exists. Thus, for // FlyFrames an alternative method is used now in that case. - SwClientIter aIter( (SwFmt&)*pFmt ); - if( RES_FLYFRMFMT == pFmt->Which() ) { - if( pFmt->getIDocumentLayoutAccess()->GetRootFrm() ) + if( pFmt->getIDocumentLayoutAccess()->GetCurrentViewShell() ) //swmod 071107//swmod 071225 { // Schauen, ob es ein SdrObject dafuer gibt - if( aIter.First( TYPE( SwFlyFrm) ) ) - nOrdNum = ((SwFlyFrm*)aIter())->GetVirtDrawObj()->GetOrdNum(); + SwFlyFrm* pFly = SwIterator<SwFlyFrm,SwFmt>::FirstElement( *pFrmFmt ); + if( pFly ) + nOrdNum = pFly->GetVirtDrawObj()->GetOrdNum(); } else { // Schauen, ob es ein SdrObject dafuer gibt - if( aIter.First( TYPE(SwFlyDrawContact) ) ) - nOrdNum = ((SwFlyDrawContact*)aIter())->GetMaster()->GetOrdNum(); + SwFlyDrawContact* pContact = SwIterator<SwFlyDrawContact,SwFmt>::FirstElement( *pFrmFmt ); + if( pContact ) + nOrdNum = pContact->GetMaster()->GetOrdNum(); } } else if( RES_DRAWFRMFMT == pFmt->Which() ) { // Schauen, ob es ein SdrObject dafuer gibt - if( aIter.First( TYPE(SwDrawContact) ) ) - nOrdNum = ((SwDrawContact*)aIter())->GetMaster()->GetOrdNum(); + SwDrawContact* pContact = SwIterator<SwDrawContact,SwFmt>::FirstElement( *pFrmFmt ); + if( pContact ) + nOrdNum = pContact->GetMaster()->GetOrdNum(); } else { OSL_ENSURE( !this, "was ist das fuer ein Format?" ); @@ -618,7 +617,8 @@ void SwDoc::InitDrawModel() nInvisibleControls = pDrawModel->GetLayerAdmin().NewLayer( sLayerNm )->GetID(); } - pDrawModel->InsertPage( pDrawModel->AllocPage( sal_False ) ); + SdrPage* pMasterPage = pDrawModel->AllocPage( sal_False ); + pDrawModel->InsertPage( pMasterPage ); RTL_LOGFILE_CONTEXT_TRACE( aLog, "after create DrawDocument" ); RTL_LOGFILE_CONTEXT_TRACE( aLog, "before create Spellchecker/Hyphenator" ); @@ -643,10 +643,24 @@ void SwDoc::InitDrawModel() pDrawModel->SetRefDevice( pRefDev ); pDrawModel->SetNotifyUndoActionHdl( LINK( this, SwDoc, AddDrawUndo )); - if ( pLayout ) + if ( pCurrentView ) { - pLayout->SetDrawPage( pDrawModel->GetPage( 0 ) ); - pLayout->GetDrawPage()->SetSize( pLayout->Frm().SSize() ); + ViewShell* pViewSh = pCurrentView; + do + { + SwRootFrm* pRoot = pViewSh->GetLayout(); + if( pRoot && !pRoot->GetDrawPage() ) + { + // Disable "multiple layout" for the moment: + // use pMasterPage instead of a new created SdrPage + // pDrawModel->AllocPage( FALSE ); + // pDrawModel->InsertPage( pDrawPage ); + SdrPage* pDrawPage = pMasterPage; + pRoot->SetDrawPage( pDrawPage ); + pDrawPage->SetSize( pRoot->Frm().SSize() ); + } + pViewSh = (ViewShell*)pViewSh->GetNext(); + }while( pViewSh != pCurrentView ); } } @@ -798,14 +812,14 @@ SdrModel* SwDoc::_MakeDrawModel() { OSL_ENSURE( !pDrawModel, "_MakeDrawModel: Why?" ); InitDrawModel(); - if ( pLayout && pLayout->GetCurrShell() ) + if ( pCurrentView ) { - ViewShell* pTmp = pLayout->GetCurrShell(); + ViewShell* pTmp = pCurrentView; do { pTmp->MakeDrawView(); pTmp = (ViewShell*) pTmp->GetNext(); - } while ( pTmp != pLayout->GetCurrShell() ); + } while ( pTmp != pCurrentView ); //Broadcast, damit die FormShell mit der DrawView verbunden werden kann if( GetDocShell() ) @@ -813,7 +827,7 @@ SdrModel* SwDoc::_MakeDrawModel() SfxSimpleHint aHnt( SW_BROADCAST_DRAWVIEWS_CREATED ); GetDocShell()->Broadcast( aHnt ); } - } + } //swmod 071029//swmod 071225 return pDrawModel; } diff --git a/sw/source/core/doc/docedt.cxx b/sw/source/core/doc/docedt.cxx index 31d7e95d16c5..8d9849f547b8 100644 --- a/sw/source/core/doc/docedt.cxx +++ b/sw/source/core/doc/docedt.cxx @@ -216,7 +216,7 @@ void _RestFlyInRange( _SaveFlyArr & rArr, const SwNodeIndex& rSttIdx, pFmt, pFmt->GetDoc()->GetSpzFrmFmts()->Count() ); pFmt->SetFmtAttr( aAnchor ); SwCntntNode* pCNd = aPos.nNode.GetNode().GetCntntNode(); - if( pCNd && pCNd->GetFrm( 0, 0, sal_False ) ) + if( pCNd && pCNd->getLayoutFrm( pFmt->GetDoc()->GetCurrentLayout(), 0, 0, sal_False ) ) pFmt->MakeFrms(); } } @@ -406,7 +406,7 @@ bool lcl_SaveFtn( const SwNodeIndex& rSttNd, const SwNodeIndex& rEndNd, } else { - pSrch->DelFrms(); + pSrch->DelFrms(0); rFtnArr.Remove( nPos ); if( bSaveFtn ) rSaveArr.Insert( pSrch ); @@ -434,7 +434,7 @@ bool lcl_SaveFtn( const SwNodeIndex& rSttNd, const SwNodeIndex& rEndNd, } else { - pSrch->DelFrms(); + pSrch->DelFrms(0); rFtnArr.Remove( nPos ); if( bSaveFtn ) rSaveArr.Insert( pSrch ); @@ -825,13 +825,7 @@ bool SwDoc::Overwrite( const SwPaM &rRg, const String &rStr ) if( nOldAttrCnt != nNewAttrCnt ) { SwUpdateAttr aHint( 0, 0, 0 ); - SwClientIter aIter( *pNode ); - SwClient* pGTO = aIter.First(TYPE( SwCrsrShell )); - while( pGTO ) - { - pGTO->Modify( 0, &aHint ); - pGTO = aIter.Next(); - } + pNode->ModifyBroadcast( 0, &aHint, TYPE( SwCrsrShell ) ); } if (!GetIDocumentUndoRedo().DoesUndo() && @@ -1892,7 +1886,7 @@ uno::Any SwDoc::Spell( SwPaM& rPaM, switch( pNd->GetNodeType() ) { case ND_TEXTNODE: - if( 0 != ( pCntFrm = ((SwTxtNode*)pNd)->GetFrm()) ) + if( 0 != ( pCntFrm = ((SwTxtNode*)pNd)->getLayoutFrm( GetCurrentLayout() )) ) { // geschutze Cellen/Flys ueberspringen, ausgeblendete //ebenfalls @@ -2121,7 +2115,7 @@ sal_Bool lcl_HyphenateNode( const SwNodePtr& rpNd, void* pArgs ) SwHyphArgs *pHyphArgs = (SwHyphArgs*)pArgs; if( pNode ) { - SwCntntFrm* pCntFrm = pNode->GetFrm(); + SwCntntFrm* pCntFrm = pNode->getLayoutFrm( pNode->GetDoc()->GetCurrentLayout() ); if( pCntFrm && !((SwTxtFrm*)pCntFrm)->IsHiddenNow() ) { sal_uInt16 *pPageSt = pHyphArgs->GetPageSt(); diff --git a/sw/source/core/doc/docfld.cxx b/sw/source/core/doc/docfld.cxx index 8b246e37b254..62cc8b4763b5 100644 --- a/sw/source/core/doc/docfld.cxx +++ b/sw/source/core/doc/docfld.cxx @@ -73,6 +73,7 @@ #include <poolfmt.hrc> // fuer InitFldTypes #include <SwUndoField.hxx> +#include "switerator.hxx" using namespace ::com::sun::star::uno; @@ -354,10 +355,10 @@ void SwDoc::UpdateFlds( SfxPoolItem *pNewHt, bool bCloseDB ) if( !pNewHt ) { SwMsgPoolItem aUpdateDDE( RES_UPDATEDDETBL ); - (*pFldTypes)[i]->Modify( 0, &aUpdateDDE ); + (*pFldTypes)[i]->ModifyNotification( 0, &aUpdateDDE ); } else - (*pFldTypes)[i]->Modify( 0, pNewHt ); + (*pFldTypes)[i]->ModifyNotification( 0, pNewHt ); break; } case RES_GETEXPFLD: @@ -368,7 +369,7 @@ void SwDoc::UpdateFlds( SfxPoolItem *pNewHt, bool bCloseDB ) if( !pNewHt ) break; default: - (*pFldTypes)[i]->Modify( 0, pNewHt ); + (*pFldTypes)[i]->ModifyNotification ( 0, pNewHt ); } } @@ -418,7 +419,7 @@ void SwDoc::UpdateRefFlds( SfxPoolItem* pHt ) SwFieldType* pFldType; for( sal_uInt16 i = 0; i < pFldTypes->Count(); ++i ) if( RES_GETREFFLD == ( pFldType = (*pFldTypes)[i] )->Which() ) - pFldType->Modify( 0, pHt ); + pFldType->ModifyNotification( 0, pHt ); } void SwDoc::UpdateTblFlds( SfxPoolItem* pHt ) @@ -436,9 +437,9 @@ void SwDoc::UpdateTblFlds( SfxPoolItem* pHt ) if( pHt && RES_TABLEFML_UPDATE == pHt->Which() ) pUpdtFld = (SwTableFmlUpdate*)pHt; - SwClientIter aIter( *pFldType ); - for( SwFmtFld* pFmtFld = (SwFmtFld*)aIter.First( TYPE( SwFmtFld )); - pFmtFld; pFmtFld = (SwFmtFld*)aIter.Next() ) + SwIterator<SwFmtFld,SwFieldType> aIter( *pFldType ); + for( SwFmtFld* pFmtFld = aIter.First(); pFmtFld; pFmtFld = aIter.Next() ) + { if( pFmtFld->GetTxtFld() ) { SwTblField* pFld = (SwTblField*)pFmtFld->GetFld(); @@ -489,6 +490,7 @@ void SwDoc::UpdateTblFlds( SfxPoolItem* pHt ) // setze bei allen das Value-Flag zurueck pFld->ChgValid( sal_False ); } + } break; } @@ -517,16 +519,13 @@ void SwDoc::UpdateTblFlds( SfxPoolItem* pHt ) if( pFldType ) { - SwClient* pLast; - SwClientIter aIter( *pFldType ); - // dann rechne mal schoen - // JP 27.03.97: Beim Berechnen am Ende anfangen - weil neue - // Felder immer am Anfang der Modifykette eingefuegt - // werden. Beim Import haben wir damit eine bessere/ - // schnellere Berechnung bei "Kettenformeln" - if( 0 != ( pLast = aIter.GoEnd() )) - do { - SwFmtFld* pFmtFld = (SwFmtFld*)pLast; + SwIterator<SwFmtFld,SwFieldType> aIter( *pFldType ); + for( SwFmtFld* pFmtFld = aIter.Last(); pFmtFld; pFmtFld = aIter.Previous() ) + { + // start calculation at the end + // new fields are inserted at the beginning of the modify chain + // that gives faster calculation on import + // mba: do we really need this "optimization"? Is it still valid? SwTblField* pFld; if( !pFmtFld->GetTxtFld() || (nsSwExtendedSubType::SUB_CMD & (pFld = (SwTblField*)pFmtFld->GetFld())->GetSubType() )) @@ -559,7 +558,7 @@ void SwDoc::UpdateTblFlds( SfxPoolItem* pHt ) { // steht im Sonderbereich, wird teuer !! Point aPt; // den im Layout 1. Frame returnen - Tab.Kopfzeile !! - pFrm = rTxtNd.GetFrm( &aPt ); + pFrm = rTxtNd.getLayoutFrm( GetCurrentLayout(), &aPt ); if( pFrm ) { SwPosition aPos( *pTblNd ); @@ -595,8 +594,8 @@ void SwDoc::UpdateTblFlds( SfxPoolItem* pHt ) } pCalc->SetCalcError( CALC_NOERR ); } - pFmtFld->Modify( 0, pHt ); - } while( 0 != ( pLast = aIter-- )); + pFmtFld->ModifyNotification( 0, pHt ); + } } // dann berechene noch die Formeln an den Boxen @@ -631,7 +630,7 @@ void SwDoc::UpdateTblFlds( SfxPoolItem* pHt ) if( !pCNd ) pCNd = GetNodes().GoNext( &aCNdIdx ); - if( pCNd && 0 != (pFrm = pCNd->GetFrm( &aPt )) ) + if( pCNd && 0 != (pFrm = pCNd->getLayoutFrm( GetCurrentLayout(), &aPt )) ) { SwPosition aPos( *pCNd ); if( GetBodyTxtNode( *this, aPos, *pFrm ) ) @@ -694,10 +693,10 @@ void SwDoc::UpdatePageFlds( SfxPoolItem* pMsgHnt ) case RES_CHAPTERFLD: case RES_GETEXPFLD: case RES_REFPAGEGETFLD: - pFldType->Modify( 0, pMsgHnt ); + pFldType->ModifyNotification( 0, pMsgHnt ); break; case RES_DOCSTATFLD: - pFldType->Modify( 0, 0 ); + pFldType->ModifyNotification( 0, 0 ); break; } SetNewFldLst(true); @@ -1508,7 +1507,7 @@ void SwDoc::UpdateExpFlds( SwTxtFld* pUpdtFld, bool bUpdRefFlds ) } } // switch - pFmtFld->Modify( 0, 0 ); // Formatierung anstossen + pFmtFld->ModifyNotification( 0, 0 ); // Formatierung anstossen if( pUpdtFld == pTxtFld ) // sollte nur dieses geupdatet werden { @@ -1643,9 +1642,8 @@ const SwDBData& SwDoc::GetDBDesc() case RES_DBNUMSETFLD: case RES_DBSETNUMBERFLD: { - SwClientIter aIter( rFldType ); - SwFmtFld* pFld = (SwFmtFld*)aIter.First( TYPE( SwFmtFld )); - while(pFld) + SwIterator<SwFmtFld,SwFieldType> aIter( rFldType ); + for( SwFmtFld* pFld = aIter.First(); pFld; pFld = aIter.Next() ) { if(pFld->IsFldInDoc()) { @@ -1657,7 +1655,6 @@ const SwDBData& SwDoc::GetDBDesc() aDBData = (static_cast < SwDBNameInfField* > (pFld->GetFld()))->GetRealDBData(); break; } - pFld = (SwFmtFld*)aIter.Next(); } } break; @@ -1894,7 +1891,7 @@ void SwDoc::ChangeDBFields( const SvStringsDtor& rOldNames, SwDBFieldType* pTyp = (SwDBFieldType*)InsertFldType( SwDBFieldType(this, pOldTyp->GetColumnName(), aNewDBData)); - pTyp->Add(pFmtFld); // Feld auf neuen Typ umhaengen + pFmtFld->RegisterToFieldType( *pTyp ); pFld->ChgTyp(pTyp); ((SwDBField*)pFld)->ClearInitialized(); @@ -2031,10 +2028,8 @@ void SwDoc::SetFixFields( bool bOnlyTimeDate, const DateTime* pNewDateTime ) for( ; nStt < 5; ++nStt ) { SwFieldType* pFldType = GetSysFldType( aTypes[ nStt ] ); - SwClientIter aDocInfIter( *pFldType ); - - for( SwFmtFld* pFld = (SwFmtFld*)aDocInfIter.First( TYPE( SwFmtFld )); - pFld; pFld = (SwFmtFld*)aDocInfIter.Next() ) + SwIterator<SwFmtFld,SwFieldType> aIter( *pFldType ); + for( SwFmtFld* pFld = aIter.First(); pFld; pFld = aIter.Next() ) { if( pFld && pFld->GetTxtFld() ) { @@ -2102,7 +2097,7 @@ void SwDoc::SetFixFields( bool bOnlyTimeDate, const DateTime* pNewDateTime ) // Formatierung anstossen if( bChgd ) - pFld->Modify( 0, 0 ); + pFld->ModifyNotification( 0, 0 ); } } } @@ -2347,7 +2342,7 @@ void SwDocUpdtFld::_MakeFldList( SwDoc& rDoc, int eGetMode ) pFormel = 0; // Formatierung anstossen - ((SwFmtFld*)pFmtFld)->Modify( 0, 0 ); + ((SwFmtFld*)pFmtFld)->ModifyNotification( 0, 0 ); } break; @@ -2367,7 +2362,7 @@ void SwDocUpdtFld::_MakeFldList( SwDoc& rDoc, int eGetMode ) // Feld Evaluieren ((SwHiddenTxtField*)pFld)->Evaluate(&rDoc); // Formatierung anstossen - ((SwFmtFld*)pFmtFld)->Modify( 0, 0 ); + ((SwFmtFld*)pFmtFld)->ModifyNotification( 0, 0 ); } break; @@ -2416,7 +2411,7 @@ void SwDocUpdtFld::GetBodyNode( const SwTxtFld& rTFld, sal_uInt16 nFldWhich ) // immer den ersten !! (in Tab-Headline, Kopf-/Fuss ) Point aPt; - const SwCntntFrm* pFrm = rTxtNd.GetFrm( &aPt, 0, sal_False ); + const SwCntntFrm* pFrm = rTxtNd.getLayoutFrm( rDoc.GetCurrentLayout(), &aPt, 0, sal_False ); _SetGetExpFld* pNew = NULL; sal_Bool bIsInBody = sal_False; @@ -2482,7 +2477,7 @@ void SwDocUpdtFld::GetBodyNode( const SwSectionNode& rSectNd ) // immer den ersten !! (in Tab-Headline, Kopf-/Fuss ) Point aPt; - const SwCntntFrm* pFrm = pCNd->GetFrm( &aPt, 0, sal_False ); + const SwCntntFrm* pFrm = pCNd->getLayoutFrm( rDoc.GetCurrentLayout(), &aPt, 0, sal_False ); if( !pFrm ) break; @@ -2638,7 +2633,7 @@ bool SwDoc::UpdateFld(SwTxtFld * pDstTxtFld, SwField & rSrcFld, if (bUpdateFlds) UpdateTblFlds( &aTblUpdate ); else - pNewFld->GetTyp()->Modify(0, &aTblUpdate); + pNewFld->GetTyp()->ModifyNotification(0, &aTblUpdate); if (! bUpdateFlds) bTblSelBreak = sal_True; @@ -2649,7 +2644,7 @@ bool SwDoc::UpdateFld(SwTxtFld * pDstTxtFld, SwField & rSrcFld, case RES_MACROFLD: if( bUpdateFlds && pDstTxtFld->GetpTxtNode() ) (pDstTxtFld->GetpTxtNode())-> - Modify( 0, pDstFmtFld ); + ModifyNotification( 0, pDstFmtFld ); break; case RES_DBNAMEFLD: @@ -2676,7 +2671,7 @@ bool SwDoc::UpdateFld(SwTxtFld * pDstTxtFld, SwField & rSrcFld, // kein break; default: - pDstFmtFld->Modify( 0, pMsgHnt ); + pDstFmtFld->ModifyNotification( 0, pMsgHnt ); } // Die Felder die wir berechnen koennen werden hier expli. diff --git a/sw/source/core/doc/docfly.cxx b/sw/source/core/doc/docfly.cxx index 4030972a325b..b39f329956a5 100644 --- a/sw/source/core/doc/docfly.cxx +++ b/sw/source/core/doc/docfly.cxx @@ -66,8 +66,8 @@ #include <UndoAttribute.hxx> #include <fmtcnct.hxx> #include <dflyobj.hxx> - #include <undoflystrattr.hxx> +#include <switerator.hxx> extern sal_uInt16 GetHtmlMode( const SwDocShell* ); @@ -154,16 +154,11 @@ SwFrmFmt* SwDoc::GetFlyNum( sal_uInt16 nIdx, FlyCntType eType ) return pRetFmt; } -/*********************************************************************** -#* Class : SwDoc -#* Methode : SetFlyFrmAnchor -#* Beschreibung: Das Ankerattribut des FlyFrms aendert sich. -#***********************************************************************/ Point lcl_FindAnchorLayPos( SwDoc& rDoc, const SwFmtAnchor& rAnch, const SwFrmFmt* pFlyFmt ) { Point aRet; - if( rDoc.GetRootFrm() ) + if( rDoc.GetCurrentViewShell() ) //swmod 071107//swmod 071225 switch( rAnch.GetAnchorId() ) { case FLY_AS_CHAR: @@ -181,7 +176,7 @@ Point lcl_FindAnchorLayPos( SwDoc& rDoc, const SwFmtAnchor& rAnch, { const SwPosition *pPos = rAnch.GetCntntAnchor(); const SwCntntNode* pNd = pPos->nNode.GetNode().GetCntntNode(); - const SwFrm* pOld = pNd ? pNd->GetFrm( &aRet, 0, sal_False ) : 0; + const SwFrm* pOld = pNd ? pNd->getLayoutFrm( rDoc.GetCurrentLayout(), &aRet, 0, sal_False ) : 0; if( pOld ) aRet = pOld->Frm().Pos(); } @@ -201,7 +196,7 @@ Point lcl_FindAnchorLayPos( SwDoc& rDoc, const SwFmtAnchor& rAnch, case FLY_AT_PAGE: { sal_uInt16 nPgNum = rAnch.GetPageNum(); - const SwPageFrm *pPage = (SwPageFrm*)rDoc.GetRootFrm()->Lower(); + const SwPageFrm *pPage = (SwPageFrm*)rDoc.GetCurrentLayout()->Lower(); for( sal_uInt16 i = 1; (i <= nPgNum) && pPage; ++i, pPage = (const SwPageFrm*)pPage->GetNext() ) if( i == nPgNum ) @@ -513,10 +508,6 @@ void SwDoc::SetFlyFrmDescription( SwFlyFrmFmt& rFlyFrmFmt, SetModified(); } -/*************************************************************************** - * Methode : sal_Bool SwDoc::SetFrmFmtToFly( SwFlyFrm&, SwFrmFmt& ) - * Beschreibung: - ***************************************************************************/ sal_Bool SwDoc::SetFrmFmtToFly( SwFrmFmt& rFmt, SwFrmFmt& rNewFmt, SfxItemSet* pSet, sal_Bool bKeepOrient ) { @@ -600,7 +591,7 @@ sal_Bool SwDoc::SetFrmFmtToFly( SwFrmFmt& rFmt, SwFrmFmt& rNewFmt, rFmt.MakeFrms(); if( pUndo ) - rFmt.Remove( pUndo ); + pUndo->DeRegisterFromFormat( rFmt ); SetModified(); @@ -616,17 +607,12 @@ void SwDoc::GetGrfNms( const SwFlyFrmFmt& rFmt, String* pGrfName, pGrfNd->GetFileFilterNms( pGrfName, pFltName ); } -/************************************************************************* -|* -|* SwDoc::ChgAnchor() -|* -*************************************************************************/ sal_Bool SwDoc::ChgAnchor( const SdrMarkList& _rMrkList, RndStdIds _eAnchorType, const sal_Bool _bSameOnly, const sal_Bool _bPosCorr ) { - OSL_ENSURE( GetRootFrm(), "Ohne Layout geht gar nichts" ); + OSL_ENSURE( GetCurrentLayout(), "Ohne Layout geht gar nichts" ); if ( !_rMrkList.GetMarkCount() || _rMrkList.GetMark( 0 )->GetMarkedSdrObj()->GetUpGroup() ) @@ -722,11 +708,11 @@ sal_Bool SwDoc::ChgAnchor( const SdrMarkList& _rMrkList, SwPosition aPos( GetNodes() ); Point aPoint( aPt ); aPoint.X() -= 1; - GetRootFrm()->GetCrsrOfst( &aPos, aPoint, &aState ); + GetCurrentLayout()->GetCrsrOfst( &aPos, aPoint, &aState ); // consider that drawing objects can be in // header/footer. Thus, <GetFrm()> by left-top-corner pTxtFrm = aPos.nNode.GetNode(). - GetCntntNode()->GetFrm( &aPt, 0, sal_False ); + GetCntntNode()->getLayoutFrm( GetCurrentLayout(), &aPt, 0, sal_False ); } const SwFrm *pTmp = ::FindAnchor( pTxtFrm, aPt ); pNewAnchorFrm = pTmp->FindFlyFrm(); @@ -744,7 +730,7 @@ sal_Bool SwDoc::ChgAnchor( const SdrMarkList& _rMrkList, } case FLY_AT_PAGE: { - pNewAnchorFrm = GetRootFrm()->Lower(); + pNewAnchorFrm = GetCurrentLayout()->Lower(); while ( pNewAnchorFrm && !pNewAnchorFrm->Frm().IsInside( aPt ) ) pNewAnchorFrm = pNewAnchorFrm->GetNext(); if ( !pNewAnchorFrm ) @@ -783,7 +769,7 @@ sal_Bool SwDoc::ChgAnchor( const SdrMarkList& _rMrkList, // es muss ein TextNode gefunden werden, denn nur dort // ist ein inhaltsgebundenes DrawObjekt zu verankern SwCrsrMoveState aState( MV_SETONLYTEXT ); - GetRootFrm()->GetCrsrOfst( &aPos, aPoint, &aState ); + GetCurrentLayout()->GetCrsrOfst( &aPos, aPoint, &aState ); //swmod 080218 } else { @@ -997,8 +983,7 @@ int SwDoc::Chain( SwFrmFmt &rSource, const SwFrmFmt &rDest ) SwFmtFrmSize aSize( rSource.GetFrmSize() ); if ( aSize.GetHeightSizeType() != ATT_FIX_SIZE ) { - SwClientIter aIter( rSource ); - SwFlyFrm *pFly = (SwFlyFrm*)aIter.First( TYPE(SwFlyFrm) ); + SwFlyFrm *pFly = SwIterator<SwFlyFrm,SwFmt>::FirstElement( rSource ); if ( pFly ) aSize.SetHeight( pFly->Frm().Height() ); aSize.SetHeightSizeType( ATT_FIX_SIZE ); diff --git a/sw/source/core/doc/docfmt.cxx b/sw/source/core/doc/docfmt.cxx index 32592c827649..bc6c1e6f3e16 100644 --- a/sw/source/core/doc/docfmt.cxx +++ b/sw/source/core/doc/docfmt.cxx @@ -1325,7 +1325,7 @@ void SwDoc::SetDefault( const SfxItemSet& rSet ) { SwFmtChg aChgFmt( pDfltCharFmt ); // dann sage mal den Frames bescheid - aCallMod.Modify( &aChgFmt, &aChgFmt ); + aCallMod.ModifyNotification( &aChgFmt, &aChgFmt ); } } } @@ -1334,7 +1334,7 @@ void SwDoc::SetDefault( const SfxItemSet& rSet ) { SwAttrSetChg aChgOld( aOld, aOld ); SwAttrSetChg aChgNew( aNew, aNew ); - aCallMod.Modify( &aChgOld, &aChgNew ); // alle veraenderten werden verschickt + aCallMod.ModifyNotification( &aChgOld, &aChgNew ); // alle veraenderten werden verschickt } // und die default-Formate wieder beim Object austragen @@ -1988,10 +1988,9 @@ void SwDoc::CopyFmtArr( const SvPtrarr& rSourceArr, pDest = FindFmtByName( rDestArr, pSrc->GetName() ); pDest->SetAuto( sal_False ); - -//JP 19.02.96: ist so wohl optimaler - loest ggfs. kein Modify aus! pDest->DelDiffs( *pSrc ); - //JP 18.08.98: Bug 55115 - copy PageDescAttribute in this case + + // #i94285#: existing <SwFmtPageDesc> instance, before copying attributes const SfxPoolItem* pItem; if( &GetAttrPool() != pSrc->GetAttrSet().GetPool() && SFX_ITEM_SET == pSrc->GetAttrSet().GetItemState( @@ -2005,7 +2004,7 @@ void SwDoc::CopyFmtArr( const SvPtrarr& rSourceArr, { pPageDesc = aPageDescs[ MakePageDesc( rNm ) ]; } - pPageDesc->Add( &aPageDesc ); + aPageDesc.RegisterToPageDesc( *pPageDesc ); SwAttrSet aTmpAttrSet( pSrc->GetAttrSet() ); aTmpAttrSet.Put( aPageDesc ); pDest->SetFmtAttr( aTmpAttrSet ); @@ -2014,7 +2013,6 @@ void SwDoc::CopyFmtArr( const SvPtrarr& rSourceArr, { pDest->SetFmtAttr( pSrc->GetAttrSet() ); } - // <-- pDest->SetPoolFmtId( pSrc->GetPoolFmtId() ); pDest->SetPoolHelpId( pSrc->GetPoolHelpId() ); @@ -2099,9 +2097,9 @@ void SwDoc::CopyPageDescHeaderFooterImpl( bool bCpyHeader, pNewFmt->ResetFmtAttr( RES_CNTNT ); } if( bCpyHeader ) - pNewFmt->Add( (SwFmtHeader*)pNewItem ); + ((SwFmtHeader*)pNewItem)->RegisterToFormat(*pNewFmt); else - pNewFmt->Add( (SwFmtFooter*)pNewItem ); + ((SwFmtFooter*)pNewItem)->RegisterToFormat(*pNewFmt); rDestFmt.SetFmtAttr( *pNewItem ); } delete pNewItem; @@ -2111,6 +2109,7 @@ void SwDoc::CopyPageDesc( const SwPageDesc& rSrcDesc, SwPageDesc& rDstDesc, sal_Bool bCopyPoolIds ) { sal_Bool bNotifyLayout = sal_False; + SwRootFrm* pTmpRoot = GetCurrentLayout();//swmod 080219 rDstDesc.SetLandscape( rSrcDesc.GetLandscape() ); rDstDesc.SetNumType( rSrcDesc.GetNumType() ); @@ -2174,9 +2173,11 @@ void SwDoc::CopyPageDesc( const SwPageDesc& rSrcDesc, SwPageDesc& rDstDesc, else rDstDesc.GetLeft().SetFmtAttr( rDstDesc.GetMaster().GetFooter() ); - if( bNotifyLayout && GetRootFrm() ) - //Layot benachrichtigen! - GetRootFrm()->CheckPageDescs( (SwPageFrm*)GetRootFrm()->Lower() ); + if( bNotifyLayout && pTmpRoot ) + { + std::set<SwRootFrm*> aAllLayouts = GetAllLayouts();//swmod 080225 + std::for_each( aAllLayouts.begin(), aAllLayouts.end(),std::mem_fun(&SwRootFrm::AllCheckPageDescs));//swmod 080226 + } //Wenn sich FussnotenInfo veraendert, so werden die Seiten //angetriggert. @@ -2185,16 +2186,10 @@ void SwDoc::CopyPageDesc( const SwPageDesc& rSrcDesc, SwPageDesc& rDstDesc, rDstDesc.SetFtnInfo( rSrcDesc.GetFtnInfo() ); SwMsgPoolItem aInfo( RES_PAGEDESC_FTNINFO ); { - SwClientIter aIter( rDstDesc.GetMaster() ); - for( SwClient* pLast = aIter.First(TYPE(SwFrm)); pLast; - pLast = aIter.Next() ) - pLast->Modify( &aInfo, 0 ); + rDstDesc.GetMaster().ModifyBroadcast( &aInfo, 0, TYPE(SwFrm) ); } { - SwClientIter aIter( rDstDesc.GetLeft() ); - for( SwClient* pLast = aIter.First(TYPE(SwFrm)); pLast; - pLast = aIter.Next() ) - pLast->Modify( &aInfo, 0 ); + rDstDesc.GetLeft().ModifyBroadcast( &aInfo, 0, TYPE(SwFrm) ); } } } diff --git a/sw/source/core/doc/docftn.cxx b/sw/source/core/doc/docftn.cxx index 6f5d0f509f52..8d7c8523aa46 100644 --- a/sw/source/core/doc/docftn.cxx +++ b/sw/source/core/doc/docftn.cxx @@ -52,8 +52,8 @@ SwEndNoteInfo& SwEndNoteInfo::operator=(const SwEndNoteInfo& rInfo) { if( rInfo.GetFtnTxtColl() ) rInfo.GetFtnTxtColl()->Add(this); - else if ( pRegisteredIn) - pRegisteredIn->Remove(this); + else if ( GetRegisteredIn()) + GetRegisteredInNonConst()->Remove(this); if ( rInfo.aPageDescDep.GetRegisteredIn() ) ((SwModify*)rInfo.aPageDescDep.GetRegisteredIn())->Add( &aPageDescDep ); @@ -109,8 +109,8 @@ SwEndNoteInfo::SwEndNoteInfo(const SwEndNoteInfo& rInfo) : aFmt( rInfo.aFmt ), nFtnOffset( rInfo.nFtnOffset ) { - if( rInfo.GetPageDescDep()->GetRegisteredIn() ) - ((SwModify*)rInfo.GetPageDescDep()->GetRegisteredIn())->Add( &aPageDescDep ); + if( rInfo.aPageDescDep.GetRegisteredIn() ) + ((SwModify*)rInfo.aPageDescDep.GetRegisteredIn())->Add( &aPageDescDep ); if( rInfo.aCharFmtDep.GetRegisteredIn() ) ((SwModify*)rInfo.aCharFmtDep.GetRegisteredIn())->Add( &aCharFmtDep ); @@ -139,7 +139,18 @@ SwPageDesc *SwEndNoteInfo::GetPageDesc( SwDoc &rDoc ) const m_bEndNote ? RES_POOLPAGE_ENDNOTE : RES_POOLPAGE_FOOTNOTE ) ); pDesc->Add( &((SwClient&)aPageDescDep) ); } - return (SwPageDesc*)aPageDescDep.GetRegisteredIn(); + + return (SwPageDesc*)( aPageDescDep.GetRegisteredIn() ); +} + +bool SwEndNoteInfo::KnowsPageDesc() const +{ + return (aPageDescDep.GetRegisteredIn() != 0); +} + +bool SwEndNoteInfo::DependsOn( const SwPageDesc* pDesc ) const +{ + return ( aPageDescDep.GetRegisteredIn() == pDesc ); } void SwEndNoteInfo::ChgPageDesc( SwPageDesc *pDesc ) @@ -186,7 +197,7 @@ void SwEndNoteInfo::SetAnchorCharFmt( SwCharFmt* pChFmt ) pChFmt->Add( &((SwClient&)aAnchorCharFmtDep) ); } -void SwEndNoteInfo::Modify( SfxPoolItem* pOld, SfxPoolItem* pNew ) +void SwEndNoteInfo::Modify( const SfxPoolItem* pOld, const SfxPoolItem* pNew ) { sal_uInt16 nWhich = pOld ? pOld->Which() : pNew ? pNew->Which() : 0 ; @@ -210,7 +221,7 @@ void SwEndNoteInfo::Modify( SfxPoolItem* pOld, SfxPoolItem* pNew ) } } else - SwClient::Modify( pOld, pNew ); + CheckRegistration( pOld, pNew ); } SwFtnInfo& SwFtnInfo::operator=(const SwFtnInfo& rInfo) @@ -258,6 +269,7 @@ SwFtnInfo::SwFtnInfo(SwTxtFmtColl *pFmt) : void SwDoc::SetFtnInfo(const SwFtnInfo& rInfo) { + SwRootFrm* pTmpRoot = GetCurrentLayout();//swmod 080219 if( !(GetFtnInfo() == rInfo) ) { const SwFtnInfo &rOld = GetFtnInfo(); @@ -281,15 +293,19 @@ void SwDoc::SetFtnInfo(const SwFtnInfo& rInfo) *pFtnInfo = rInfo; - if ( GetRootFrm() ) + if (pTmpRoot) { + std::set<SwRootFrm*> aAllLayouts = GetAllLayouts();//swmod 080304 if ( bFtnPos ) - GetRootFrm()->RemoveFtns(); + //pTmpRoot->RemoveFtns(); + std::for_each( aAllLayouts.begin(), aAllLayouts.end(),std::mem_fun(&SwRootFrm::AllRemoveFtns));//swmod 080305 else { - GetRootFrm()->UpdateFtnNums(); + //pTmpRoot->UpdateFtnNums(); + std::for_each( aAllLayouts.begin(), aAllLayouts.end(),std::mem_fun(&SwRootFrm::UpdateFtnNums));//swmod 080304 if ( bFtnDesc ) - GetRootFrm()->CheckFtnPageDescs( sal_False ); + //pTmpRoot->CheckFtnPageDescs( FALSE ); + std::for_each( aAllLayouts.begin(), aAllLayouts.end(),std::bind2nd(std::mem_fun(&SwRootFrm::CheckFtnPageDescs), sal_False));//swmod 080304 if ( bExtra ) { //Fuer die Benachrichtung bezueglich ErgoSum usw. sparen wir uns @@ -304,14 +320,14 @@ void SwDoc::SetFtnInfo(const SwFtnInfo& rInfo) } } } - } + } //swmod 080219 if( FTNNUM_PAGE != rInfo.eNum ) GetFtnIdxs().UpdateAllFtn(); else if( bFtnChrFmts ) { SwFmtChg aOld( pOldChrFmt ); SwFmtChg aNew( pNewChrFmt ); - pFtnInfo->Modify( &aOld, &aNew ); + pFtnInfo->ModifyNotification( &aOld, &aNew ); } // #i81002# no update during loading @@ -325,6 +341,7 @@ void SwDoc::SetFtnInfo(const SwFtnInfo& rInfo) void SwDoc::SetEndNoteInfo(const SwEndNoteInfo& rInfo) { + SwRootFrm* pTmpRoot = GetCurrentLayout();//swmod 080219 if( !(GetEndNoteInfo() == rInfo) ) { if(GetIDocumentUndoRedo().DoesUndo()) @@ -351,10 +368,14 @@ void SwDoc::SetEndNoteInfo(const SwEndNoteInfo& rInfo) *pEndNoteInfo = rInfo; - if ( GetRootFrm() ) + if ( pTmpRoot ) { if ( bFtnDesc ) - GetRootFrm()->CheckFtnPageDescs( sal_True ); + //pTmpRoot->CheckFtnPageDescs( TRUE ); + { + std::set<SwRootFrm*> aAllLayouts = GetAllLayouts(); + std::for_each( aAllLayouts.begin(), aAllLayouts.end(),std::bind2nd(std::mem_fun(&SwRootFrm::CheckFtnPageDescs), sal_True));//swmod 080304 + } if ( bExtra ) { //Fuer die Benachrichtung bezueglich ErgoSum usw. sparen wir uns @@ -368,14 +389,14 @@ void SwDoc::SetEndNoteInfo(const SwEndNoteInfo& rInfo) pTxtFtn->SetNumber( rFtn.GetNumber(), &rFtn.GetNumStr()); } } - } + } //swmod 080219 if( bNumChg ) GetFtnIdxs().UpdateAllFtn(); else if( bFtnChrFmts ) { SwFmtChg aOld( pOldChrFmt ); SwFmtChg aNew( pNewChrFmt ); - pEndNoteInfo->Modify( &aOld, &aNew ); + pEndNoteInfo->ModifyNotification( &aOld, &aNew ); } // #i81002# no update during loading @@ -392,6 +413,7 @@ bool SwDoc::SetCurFtn( const SwPaM& rPam, const String& rNumStr, sal_uInt16 nNumber, bool bIsEndNote ) { SwFtnIdxs& rFtnArr = GetFtnIdxs(); + SwRootFrm* pTmpRoot = GetCurrentLayout();//swmod 080219 const SwPosition* pStt = rPam.Start(), *pEnd = rPam.End(); const sal_uLong nSttNd = pStt->nNode.GetIndex(); @@ -439,7 +461,7 @@ bool SwDoc::SetCurFtn( const SwPaM& rPam, const String& rNumStr, pTxtFtn->CheckCondColl(); //#i11339# dispose UNO wrapper when a footnote is changed to an endnote or vice versa SwPtrMsgPoolItem aMsgHint( RES_FOOTNOTE_DELETED, (void*)&pTxtFtn->GetAttr() ); - GetUnoCallBack()->Modify( &aMsgHint, &aMsgHint ); + GetUnoCallBack()->ModifyNotification( &aMsgHint, &aMsgHint ); } } } @@ -487,8 +509,12 @@ bool SwDoc::SetCurFtn( const SwPaM& rPam, const String& rNumStr, if ( !bTypeChgd ) rFtnArr.UpdateAllFtn(); } - else if( GetRootFrm() ) - GetRootFrm()->UpdateFtnNums(); + else if( pTmpRoot ) + // + { + std::set<SwRootFrm*> aAllLayouts = GetAllLayouts(); + std::for_each( aAllLayouts.begin(), aAllLayouts.end(),std::mem_fun(&SwRootFrm::UpdateFtnNums)); + } //swmod 080304pTmpRoot->UpdateFtnNums(); //swmod 080219 SetModified(); } else diff --git a/sw/source/core/doc/docglbl.cxx b/sw/source/core/doc/docglbl.cxx index 14da026b3b8b..b72e5ded4689 100644 --- a/sw/source/core/doc/docglbl.cxx +++ b/sw/source/core/doc/docglbl.cxx @@ -55,7 +55,7 @@ #include <section.hxx> #include <doctxm.hxx> #include <poolfmt.hxx> - +#include <switerator.hxx> #include <com/sun/star/uno/Reference.h> #include <com/sun/star/document/XDocumentPropertiesSupplier.hpp> #include <com/sun/star/document/XDocumentProperties.hpp> @@ -115,9 +115,8 @@ sal_Bool SwDoc::SplitDoc( sal_uInt16 eDocType, const String& rPath, if( pSplitColl->GetAttrOutlineLevel() == 0 )//<-end,zhaojianwei, 0814 { pOutlNds = new SwOutlineNodes( 8, 8 ); - SwClientIter aIter( *(SwModify*)pSplitColl ); - for( SwTxtNode* pTNd = (SwTxtNode*)aIter.First( TYPE( SwTxtNode )); - pTNd; pTNd = (SwTxtNode*)aIter.Next() ) + SwIterator<SwTxtNode,SwFmtColl> aIter( *pSplitColl ); + for( SwTxtNode* pTNd = aIter.First(); pTNd; pTNd = aIter.Next() ) if( pTNd->GetNodes().IsDocNodes() ) pOutlNds->Insert( pTNd ); diff --git a/sw/source/core/doc/doclay.cxx b/sw/source/core/doc/doclay.cxx index 631225ded54d..46dfe7ec0e2c 100644 --- a/sw/source/core/doc/doclay.cxx +++ b/sw/source/core/doc/doclay.cxx @@ -694,8 +694,8 @@ SwFlyFrmFmt* SwDoc::_MakeFlySection( const SwPosition& rAnchPos, } // Frames anlegen - if( GetRootFrm() ) - pFmt->MakeFrms(); // ??? + if( GetCurrentViewShell() ) + pFmt->MakeFrms(); // ??? //swmod 071108//swmod 071225 if (GetIDocumentUndoRedo().DoesUndo()) { @@ -965,7 +965,7 @@ SwDrawFrmFmt* SwDoc::Insert( const SwPaM &rRg, SwDrawContact* pContact = new SwDrawContact( pFmt, &rDrawObj ); // ggfs. Frames anlegen - if( GetRootFrm() ) + if( GetCurrentViewShell() ) { pFmt->MakeFrms(); // #i42319# - follow-up of #i35635# @@ -1058,11 +1058,11 @@ void SwDoc::GetAllFlyFmts( SwPosFlyFrms& rPosFlyFmts, // kein Layout oder nur ein Teil, dann wars das // Seitenbezogen Flys nur, wenn vollstaendig "gewuenscht" wird ! - if( !GetRootFrm() || pCmpRange ) + if( !GetCurrentViewShell() || pCmpRange ) //swmod 071108//swmod 071225 return; pFPos = 0; - SwPageFrm *pPage = (SwPageFrm*)GetRootFrm()->GetLower(); + SwPageFrm *pPage = (SwPageFrm*)GetCurrentLayout()->GetLower(); //swmod 080218 while( pPage ) { if( pPage->GetSortedObjs() ) @@ -1245,6 +1245,17 @@ lcl_InsertLabel(SwDoc & rDoc, SwTxtFmtColls *const pTxtFmtCollTbl, //Erstmal das Format zum Fly besorgen und das Layout entkoppeln. SwFrmFmt *pOldFmt = rDoc.GetNodes()[nNdIdx]->GetFlyFmt(); OSL_ENSURE( pOldFmt, "Format des Fly nicht gefunden." ); + // --> OD #i115719# + // <title> and <description> attributes are lost when calling <DelFrms()>. + // Thus, keep them and restore them after the calling <MakeFrms()> + const bool bIsSwFlyFrmFmtInstance( dynamic_cast<SwFlyFrmFmt*>(pOldFmt) != 0 ); + const String sTitle( bIsSwFlyFrmFmtInstance + ? static_cast<SwFlyFrmFmt*>(pOldFmt)->GetObjTitle() + : String() ); + const String sDescription( bIsSwFlyFrmFmtInstance + ? static_cast<SwFlyFrmFmt*>(pOldFmt)->GetObjDescription() + : String() ); + // <-- pOldFmt->DelFrms(); pNewFmt = rDoc.MakeFlyFrmFmt( rDoc.GetUniqueFrameName(), @@ -1382,6 +1393,13 @@ lcl_InsertLabel(SwDoc & rDoc, SwTxtFmtColls *const pTxtFmtCollTbl, //Nun nur noch die Flys erzeugen lassen. Das ueberlassen //wir vorhanden Methoden (insb. fuer InCntFlys etwas aufwendig). pNewFmt->MakeFrms(); + // --> OD #i115719# + if ( bIsSwFlyFrmFmtInstance ) + { + static_cast<SwFlyFrmFmt*>(pOldFmt)->SetObjTitle( sTitle ); + static_cast<SwFlyFrmFmt*>(pOldFmt)->SetObjDescription( sDescription ); + } + // <-- } break; @@ -1840,11 +1858,12 @@ IMPL_LINK( SwDoc, DoIdleJobs, Timer *, pTimer ) pModLogFile = new ::rtl::Logfile( "First DoIdleJobs" ); #endif - if( GetRootFrm() && GetRootFrm()->GetCurrShell() && + SwRootFrm* pTmpRoot = GetCurrentLayout();//swmod 080219 + if( pTmpRoot && !SfxProgress::GetActiveProgress( pDocShell ) ) { ViewShell *pSh, *pStartSh; - pSh = pStartSh = GetRootFrm()->GetCurrShell(); + pSh = pStartSh = GetCurrentViewShell(); do { if( pSh->ActionPend() ) { @@ -1855,10 +1874,9 @@ IMPL_LINK( SwDoc, DoIdleJobs, Timer *, pTimer ) pSh = (ViewShell*)pSh->GetNext(); } while( pSh != pStartSh ); - if (GetRootFrm()->IsNeedGrammarCheck()) + if( pTmpRoot->IsNeedGrammarCheck() ) { sal_Bool bIsOnlineSpell = pSh->GetViewOptions()->IsOnlineSpell(); - sal_Bool bIsAutoGrammar = sal_False; SvtLinguConfig().GetProperty( ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( UPN_IS_GRAMMAR_AUTO )) ) >>= bIsAutoGrammar; @@ -1866,12 +1884,20 @@ IMPL_LINK( SwDoc, DoIdleJobs, Timer *, pTimer ) if (bIsOnlineSpell && bIsAutoGrammar) StartGrammarChecking( *this ); } - - sal_uInt16 nFldUpdFlag; - if( GetRootFrm()->IsIdleFormat() ) - GetRootFrm()->GetCurrShell()->LayoutIdle(); - else if( ( AUTOUPD_FIELD_ONLY == - ( nFldUpdFlag = static_cast<sal_uInt16>(getFieldUpdateFlags(true)) ) + SwFldUpdateFlags nFldUpdFlag; + std::set<SwRootFrm*> aAllLayouts = GetAllLayouts();//swmod 080320 + std::set<SwRootFrm*>::iterator pLayIter = aAllLayouts.begin(); + for ( ;pLayIter != aAllLayouts.end();pLayIter++ ) + { + if ((*pLayIter)->IsIdleFormat()) + { + (*pLayIter)->GetCurrShell()->LayoutIdle(); + break; + } + } + bool bAllValid = pLayIter == aAllLayouts.end() ? 1 : 0; + if( bAllValid && ( AUTOUPD_FIELD_ONLY == + ( nFldUpdFlag = getFieldUpdateFlags(true) ) || AUTOUPD_FIELD_AND_CHARTS == nFldUpdFlag ) && GetUpdtFlds().IsFieldsDirty() && !GetUpdtFlds().IsInUpdateFlds() && @@ -1883,25 +1909,25 @@ IMPL_LINK( SwDoc, DoIdleJobs, Timer *, pTimer ) // chaos::Action-Klammerung! GetUpdtFlds().SetInUpdateFlds( sal_True ); - GetRootFrm()->StartAllAction(); + pTmpRoot->StartAllAction(); // no jump on update of fields #i85168# const sal_Bool bOldLockView = pStartSh->IsViewLocked(); pStartSh->LockView( sal_True ); - GetSysFldType( RES_CHAPTERFLD )->Modify( 0, 0 ); // KapitelFld + GetSysFldType( RES_CHAPTERFLD )->ModifyNotification( 0, 0 ); // KapitelFld UpdateExpFlds( 0, sal_False ); // Expression-Felder Updaten UpdateTblFlds(NULL); // Tabellen UpdateRefFlds(NULL); // Referenzen - GetRootFrm()->EndAllAction(); + pTmpRoot->EndAllAction(); pStartSh->LockView( bOldLockView ); GetUpdtFlds().SetInUpdateFlds( sal_False ); GetUpdtFlds().SetFieldsDirty( sal_False ); } - } + } //swmod 080219 #ifdef TIMELOG if( pModLogFile && 1 != (long)pModLogFile ) delete pModLogFile, ((long&)pModLogFile) = 1; @@ -1914,7 +1940,7 @@ IMPL_LINK( SwDoc, DoIdleJobs, Timer *, pTimer ) IMPL_STATIC_LINK( SwDoc, BackgroundDone, SvxBrushItem*, EMPTYARG ) { ViewShell *pSh, *pStartSh; - pSh = pStartSh = pThis->GetRootFrm()->GetCurrShell(); + pSh = pStartSh = pThis->GetCurrentViewShell(); //swmod 071108//swmod 071225 if( pStartSh ) do { if( pSh->GetWin() ) @@ -2151,9 +2177,9 @@ sal_Bool SwDoc::IsInHeaderFooter( const SwNodeIndex& rIdx ) const // Redlines auch an Start- und Endnodes haengen, muss der Index nicht // unbedingt der eines Content-Nodes sein. SwNode* pNd = &rIdx.GetNode(); - if( pNd->IsCntntNode() && pLayout ) + if( pNd->IsCntntNode() && pCurrentView )//swmod 071029//swmod 071225 { - const SwFrm *pFrm = pNd->GetCntntNode()->GetFrm(); + const SwFrm *pFrm = pNd->GetCntntNode()->getLayoutFrm( GetCurrentLayout() ); if( pFrm ) { const SwFrm *pUp = pFrm->GetUpper(); @@ -2265,11 +2291,74 @@ sal_Bool SwDoc::IsInVerticalText( const SwPosition& rPos, const Point* pPt ) con return FRMDIR_VERT_TOP_RIGHT == nDir || FRMDIR_VERT_TOP_LEFT == nDir; } -const SwRootFrm* SwDoc::GetRootFrm() const { return pLayout; } -SwRootFrm* SwDoc::GetRootFrm() { return pLayout; } -void SwDoc::SetRootFrm( SwRootFrm* pNew ) { pLayout = pNew; } -SwLayouter* SwDoc::GetLayouter() { return pLayouter; } -const SwLayouter* SwDoc::GetLayouter() const { return pLayouter; } -void SwDoc::SetLayouter( SwLayouter* pNew ) { pLayouter = pNew; } +void SwDoc::SetCurrentViewShell( ViewShell* pNew ) +{ + pCurrentView = pNew; +} + +SwLayouter* SwDoc::GetLayouter() +{ + return pLayouter; +} + +const SwLayouter* SwDoc::GetLayouter() const +{ + return pLayouter; +} + +void SwDoc::SetLayouter( SwLayouter* pNew ) +{ + pLayouter = pNew; +} + +const ViewShell *SwDoc::GetCurrentViewShell() const +{ + return pCurrentView; +} + +ViewShell *SwDoc::GetCurrentViewShell() +{ + return pCurrentView; +} //swmod 080219 It must be able to communicate to a ViewShell.This is going to be removedd later. + +const SwRootFrm *SwDoc::GetCurrentLayout() const +{ + if(GetCurrentViewShell()) + return GetCurrentViewShell()->GetLayout(); + return 0; +} + +SwRootFrm *SwDoc::GetCurrentLayout() +{ + if(GetCurrentViewShell()) + return GetCurrentViewShell()->GetLayout(); + return 0; +} + +bool SwDoc::HasLayout() const +{ + // if there is a view, there is always a layout + return (pCurrentView != 0); +} + +std::set<SwRootFrm*> SwDoc::GetAllLayouts() +{ + std::set<SwRootFrm*> aAllLayouts; + ViewShell *pStart = GetCurrentViewShell(); + ViewShell *pTemp = pStart; + if ( pTemp ) + { + do + { + if (pTemp->GetLayout()) + { + aAllLayouts.insert(pTemp->GetLayout()); + pTemp = (ViewShell*)pTemp->GetNext(); + } + } while(pTemp!=pStart); + } + + return aAllLayouts; +}//swmod 070825 -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
\ No newline at end of file diff --git a/sw/source/core/doc/docnew.cxx b/sw/source/core/doc/docnew.cxx index 754b9b000183..5c18528525f7 100644 --- a/sw/source/core/doc/docnew.cxx +++ b/sw/source/core/doc/docnew.cxx @@ -229,7 +229,7 @@ SwDoc::SwDoc() pGrfFmtCollTbl( new SwGrfFmtColls() ), pTOXTypes( new SwTOXTypes() ), pDefTOXBases( new SwDefTOXBase_Impl() ), - pLayout( 0 ), // Rootframe des spezifischen Layouts. + pCurrentView( 0 ), //swmod 071225 pDrawModel( 0 ), pUpdtFlds( new SwDocUpdtFld() ), pFldTypes( new SwFldTypes() ), @@ -278,6 +278,7 @@ SwDoc::SwDoc() mbClipBoard( false ), mbColumnSelection( false ), mbProtectForm(false), // i#78591# + mbLastBrowseMode( false ), n32DummyCompatabilityOptions1(0), n32DummyCompatabilityOptions2(0), mbStartIdleTimer(sal_False) @@ -292,7 +293,6 @@ SwDoc::SwDoc() mbUpdateExpFld = mbNewDoc = mbCopyIsMove = - mbBrowseMode = mbInReading = mbInXMLImport = mbUpdateTOX = @@ -492,8 +492,6 @@ SwDoc::~SwDoc() mbDtor = sal_True; - DELETEZ( pLayout ); - delete pRedlineTbl; delete pUnoCrsrTbl; delete pAutoFmtRedlnComment; @@ -572,10 +570,8 @@ SwDoc::~SwDoc() // Delete fuer Collections // damit die Abhaengigen wech sind - SwTxtFmtColl *pFtnColl = pFtnInfo->GetFtnTxtColl(); - if ( pFtnColl ) pFtnColl->Remove(pFtnInfo); - pFtnColl = pEndNoteInfo->GetFtnTxtColl(); - if ( pFtnColl ) pFtnColl->Remove(pEndNoteInfo); + pFtnInfo->ReleaseCollection(); + pEndNoteInfo->ReleaseCollection(); OSL_ENSURE( pDfltTxtFmtColl == (*pTxtFmtCollTbl)[0], "Default-Text-Collection muss immer am Anfang stehen" ); @@ -786,7 +782,7 @@ void SwDoc::ClearDoc() // den ersten immer wieder neu anlegen (ohne Attribute/Vorlagen/...) SwTxtNode* pFirstNd = GetNodes().MakeTxtNode( aSttIdx, pDfltTxtFmtColl ); - if( pLayout ) + if( pCurrentView ) //swmod 071029//swmod 071225 { // set the layout to the dummy pagedesc pFirstNd->SetAttr( SwFmtPageDesc( pDummyPgDsc )); @@ -819,10 +815,8 @@ void SwDoc::ClearDoc() // Delete fuer Collections // damit die Abhaengigen wech sind - SwTxtFmtColl* pFtnColl = pFtnInfo->GetFtnTxtColl(); - if( pFtnColl ) pFtnColl->Remove( pFtnInfo ); - pFtnColl = pEndNoteInfo->GetFtnTxtColl(); - if( pFtnColl ) pFtnColl->Remove( pEndNoteInfo ); + pFtnInfo->ReleaseCollection(); + pEndNoteInfo->ReleaseCollection(); // opt.: ausgehend davon, das Standard als 2. im Array // steht, sollte das als letztes geloescht werden, damit @@ -833,14 +827,14 @@ void SwDoc::ClearDoc() pGrfFmtCollTbl->DeleteAndDestroy( 1, pGrfFmtCollTbl->Count()-1 ); pCharFmtTbl->DeleteAndDestroy( 1, pCharFmtTbl->Count()-1 ); - if( pLayout ) + if( pCurrentView ) { // search the FrameFormat of the root frm. This is not allowed to delete - pFrmFmtTbl->Remove( pFrmFmtTbl->GetPos( pLayout->GetFmt() ) ); + pFrmFmtTbl->Remove( pFrmFmtTbl->GetPos( pCurrentView->GetLayout()->GetFmt() ) ); pFrmFmtTbl->DeleteAndDestroy( 1, pFrmFmtTbl->Count()-1 ); - pFrmFmtTbl->Insert( pLayout->GetFmt(), pFrmFmtTbl->Count() ); + pFrmFmtTbl->Insert( pCurrentView->GetLayout()->GetFmt(), pFrmFmtTbl->Count() ); } - else + else //swmod 071029//swmod 071225 pFrmFmtTbl->DeleteAndDestroy( 1, pFrmFmtTbl->Count()-1 ); xForbiddenCharsTable.clear(); @@ -938,7 +932,7 @@ void SwDoc::UpdateLinks( sal_Bool bUI ) SfxMedium* pMedium = GetDocShell()->GetMedium(); SfxFrame* pFrm = pMedium ? pMedium->GetLoadTargetFrame() : 0; Window* pDlgParent = pFrm ? &pFrm->GetWindow() : 0; - if( GetRootFrm() && !GetEditShell( &pVSh ) && !pVSh ) + if( GetCurrentViewShell() && !GetEditShell( &pVSh ) && !pVSh ) //swmod 071108//swmod 071225 { ViewShell aVSh( *this, 0, 0 ); diff --git a/sw/source/core/doc/docnum.cxx b/sw/source/core/doc/docnum.cxx index 2f423a902b78..b184b636162b 100644 --- a/sw/source/core/doc/docnum.cxx +++ b/sw/source/core/doc/docnum.cxx @@ -60,9 +60,9 @@ #include <frmatr.hxx> #include <SwStyleNameMapper.hxx> #include <SwNodeNum.hxx> - #include <list.hxx> #include <listfunc.hxx> +#include <switerator.hxx> #include <map> @@ -140,8 +140,6 @@ void SwDoc::PropagateOutlineRule() if(pColl->IsAssignedToListLevelOfOutlineStyle())//<-end,zhaojianwei { - SwClientIter aIter(*pColl); - // Check only the list style, which is set at the paragraph style const SwNumRuleItem & rCollRuleItem = pColl->GetNumRule( sal_False ); @@ -1161,11 +1159,10 @@ void SwDoc::StopNumRuleAnimations( OutputDevice* pOut ) aTxtNodeIter != aTxtNodeList.end(); ++aTxtNodeIter ) { SwTxtNode* pTNd = *aTxtNodeIter; - SwClientIter aIter( *pTNd ); - for( SwFrm* pFrm = (SwFrm*)aIter.First( TYPE(SwFrm) ); - pFrm; pFrm = (SwFrm*)aIter.Next() ) - if( ((SwTxtFrm*)pFrm)->HasAnimation() ) - ((SwTxtFrm*)pFrm)->StopAnimation( pOut ); + SwIterator<SwTxtFrm,SwTxtNode> aIter(*pTNd); + for(SwTxtFrm* pFrm = aIter.First(); pFrm; pFrm = aIter.Next() ) + if( pFrm->HasAnimation() ) + pFrm->StopAnimation( pOut ); } } } diff --git a/sw/source/core/doc/docredln.cxx b/sw/source/core/doc/docredln.cxx index e409ec3462d8..bbd8bc4ee608 100644 --- a/sw/source/core/doc/docredln.cxx +++ b/sw/source/core/doc/docredln.cxx @@ -2770,8 +2770,8 @@ void SwRedlineTbl::Remove( sal_uInt16 nP, sal_uInt16 nL ) _SwRedlineTbl::Remove( nP, nL ); ViewShell* pSh; - if( pDoc && !pDoc->IsInDtor() && pDoc->GetRootFrm() && - 0 != ( pSh = pDoc->GetRootFrm()->GetCurrShell()) ) + if( pDoc && !pDoc->IsInDtor() && + 0 != ( pSh = pDoc->GetCurrentViewShell()) ) //swmod 071108//swmod 071225 pSh->InvalidateWindows( SwRect( 0, 0, LONG_MAX, LONG_MAX ) ); } @@ -2784,8 +2784,8 @@ void SwRedlineTbl::DeleteAndDestroy( sal_uInt16 nP, sal_uInt16 nL ) _SwRedlineTbl::DeleteAndDestroy( nP, nL ); ViewShell* pSh; - if( pDoc && !pDoc->IsInDtor() && pDoc->GetRootFrm() && - 0 != ( pSh = pDoc->GetRootFrm()->GetCurrShell()) ) + if( pDoc && !pDoc->IsInDtor() && + 0 != ( pSh = pDoc->GetCurrentViewShell() ) ) //swmod 071108//swmod 071225 pSh->InvalidateWindows( SwRect( 0, 0, LONG_MAX, LONG_MAX ) ); } @@ -3276,7 +3276,7 @@ void SwRedline::InvalidateRange() // das Layout anstossen { aHt.nStart = n == nSttNd ? nSttCnt : 0; aHt.nEnd = n == nEndNd ? nEndCnt : ((SwTxtNode*)pNd)->GetTxt().Len(); - ((SwTxtNode*)pNd)->Modify( &aHt, &aHt ); + ((SwTxtNode*)pNd)->ModifyNotification( &aHt, &aHt ); } } diff --git a/sw/source/core/doc/doctxm.cxx b/sw/source/core/doc/doctxm.cxx index 00d425324f25..870265cb288d 100644 --- a/sw/source/core/doc/doctxm.cxx +++ b/sw/source/core/doc/doctxm.cxx @@ -77,6 +77,7 @@ #include <breakit.hxx> #include <editsh.hxx> #include <scriptinfo.hxx> +#include <switerator.hxx> using namespace ::com::sun::star; @@ -255,19 +256,20 @@ const SwTOXMark& SwDoc::GotoTOXMark( const SwTOXMark& rCurTOXMark, const SwTOXMark* pMax = &rCurTOXMark; const SwTOXMark* pMin = &rCurTOXMark; - const SwModify* pType = rCurTOXMark.GetRegisteredIn(); - SwClientIter aIter( *(SwModify*)pType ); + const SwTOXType* pType = rCurTOXMark.GetTOXType(); + SwTOXMarks aMarks; + SwTOXMark::InsertTOXMarks( aMarks, *pType ); const SwTOXMark* pTOXMark; const SwCntntFrm* pCFrm; Point aPt; - for( pTOXMark = (SwTOXMark*)aIter.First( TYPE( SwTOXMark )); pTOXMark; - pTOXMark = (SwTOXMark*)aIter.Next() ) + for( sal_Int32 nMark=0; nMark<aMarks.Count(); nMark++ ) { + pTOXMark = aMarks[nMark]; if( pTOXMark != &rCurTOXMark && 0 != ( pMark = pTOXMark->GetTxtTOXMark()) && 0 != ( pTOXSrc = pMark->GetpTxtNd() ) && - 0 != ( pCFrm = pTOXSrc->GetFrm( &aPt, 0, sal_False )) && + 0 != ( pCFrm = pTOXSrc->getLayoutFrm( GetCurrentLayout(), &aPt, 0, sal_False )) && ( bInReadOnly || !pCFrm->IsProtected() )) { CompareNodeCntnt aAbsNew( pTOXSrc->GetIndex(), *pMark->GetStart() ); @@ -775,7 +777,7 @@ sal_Bool SwTOXBaseSection::SetPosAtStartEnd( SwPosition& rPos, sal_Bool bAtStart Beschreibung: Verzeichnisinhalt zusammensammeln --------------------------------------------------------------------*/ void SwTOXBaseSection::Update(const SfxItemSet* pAttr, - const bool _bNewTOX ) + const bool _bNewTOX )//swmodtest 080307 { const SwSectionNode* pSectNd; if( !SwTOXBase::GetRegisteredIn()->GetDepends() || @@ -1053,8 +1055,11 @@ sNm.AppendAscii( RTL_CONSTASCII_STRINGPARAM( "_Head" )); pDoc->GetNodes().Delete( aInsPos, 1 ); aN2L.RestoreUpperFrms( pDoc->GetNodes(), nIdx, nIdx + 1 ); - if(pDoc->GetRootFrm()) - SwFrm::CheckPageDescs( (SwPageFrm*)pDoc->GetRootFrm()->Lower() ); + std::set<SwRootFrm*> aAllLayouts = pDoc->GetAllLayouts(); + for ( std::set<SwRootFrm*>::iterator pLayoutIter = aAllLayouts.begin(); pLayoutIter != aAllLayouts.end(); pLayoutIter++) + { + SwFrm::CheckPageDescs( (SwPageFrm*)(*pLayoutIter)->Lower() ); + }//swmod 080310 SetProtect( SwTOXBase::IsProtected() ); } @@ -1159,18 +1164,17 @@ SwTxtFmtColl* SwTOXBaseSection::GetTxtFmtColl( sal_uInt16 nLevel ) void SwTOXBaseSection::UpdateMarks( const SwTOXInternational& rIntl, const SwTxtNode* pOwnChapterNode ) { - const SwModify* pType = SwTOXBase::GetRegisteredIn(); + const SwTOXType* pType = (SwTOXType*) SwTOXBase::GetRegisteredIn(); if( !pType->GetDepends() ) return; SwDoc* pDoc = (SwDoc*)GetFmt()->GetDoc(); TOXTypes eTOXTyp = GetTOXType()->GetType(); - SwClientIter aIter( *(SwModify*)pType ); + SwIterator<SwTOXMark,SwTOXType> aIter( *pType ); SwTxtTOXMark* pTxtMark; SwTOXMark* pMark; - for( pMark = (SwTOXMark*)aIter.First( TYPE( SwTOXMark )); pMark; - pMark = (SwTOXMark*)aIter.Next() ) + for( pMark = aIter.First(); pMark; pMark = aIter.Next() ) { ::SetProgressState( 0, pDoc->GetDocShell() ); @@ -1184,7 +1188,7 @@ void SwTOXBaseSection::UpdateMarks( const SwTOXInternational& rIntl, // if selected use marks from the same chapter only if( pTOXSrc->GetNodes().IsDocNodes() && pTOXSrc->GetTxt().Len() && pTOXSrc->GetDepends() && - pTOXSrc->GetFrm() && + pTOXSrc->getLayoutFrm( pDoc->GetCurrentLayout() ) && (!IsFromChapter() || ::lcl_FindChapterNode( *pTOXSrc, 0 ) == pOwnChapterNode ) && !pTOXSrc->HasHiddenParaField() && !SwScriptInfo::IsInHiddenRange( *pTOXSrc, *pTxtMark->GetStart() ) ) @@ -1244,7 +1248,7 @@ void SwTOXBaseSection::UpdateOutline( const SwTxtNode* pOwnChapterNode ) SwTxtNode* pTxtNd = rOutlNds[ n ]->GetTxtNode(); if( pTxtNd && pTxtNd->Len() && pTxtNd->GetDepends() && sal_uInt16( pTxtNd->GetAttrOutlineLevel()) <= GetLevel() && - pTxtNd->GetFrm() && + pTxtNd->getLayoutFrm( pDoc->GetCurrentLayout() ) && !pTxtNd->HasHiddenParaField() && !pTxtNd->HasHiddenCharAttribute( true ) && ( !IsFromChapter() || @@ -1278,13 +1282,12 @@ void SwTOXBaseSection::UpdateTemplate( const SwTxtNode* pOwnChapterNode ) pColl->IsAssignedToListLevelOfOutlineStyle()) ) continue; - SwClientIter aIter( *pColl ); - SwTxtNode* pTxtNd = (SwTxtNode*)aIter.First( TYPE( SwTxtNode )); - for( ; pTxtNd; pTxtNd = (SwTxtNode*)aIter.Next() ) + SwIterator<SwTxtNode,SwFmtColl> aIter( *pColl ); + for( SwTxtNode* pTxtNd = aIter.First(); pTxtNd; pTxtNd = aIter.Next() ) { ::SetProgressState( 0, pDoc->GetDocShell() ); - if( pTxtNd->GetTxt().Len() && pTxtNd->GetFrm() && + if( pTxtNd->GetTxt().Len() && pTxtNd->getLayoutFrm( pDoc->GetCurrentLayout() ) && pTxtNd->GetNodes().IsDocNodes() && ( !IsFromChapter() || pOwnChapterNode == ::lcl_FindChapterNode( *pTxtNd, 0 ) ) ) @@ -1307,9 +1310,8 @@ void SwTOXBaseSection::UpdateSequence( const SwTxtNode* pOwnChapterNode ) if(!pSeqFld) return; - SwClientIter aIter( *pSeqFld ); - SwFmtFld* pFmtFld = (SwFmtFld*)aIter.First( TYPE( SwFmtFld )); - for( ; pFmtFld; pFmtFld = (SwFmtFld*)aIter.Next() ) + SwIterator<SwFmtFld,SwFieldType> aIter( *pSeqFld ); + for( SwFmtFld* pFmtFld = aIter.First(); pFmtFld; pFmtFld = aIter.Next() ) { const SwTxtFld* pTxtFld = pFmtFld->GetTxtFld(); if(!pTxtFld) @@ -1317,7 +1319,7 @@ void SwTOXBaseSection::UpdateSequence( const SwTxtNode* pOwnChapterNode ) const SwTxtNode& rTxtNode = pTxtFld->GetTxtNode(); ::SetProgressState( 0, pDoc->GetDocShell() ); - if( rTxtNode.GetTxt().Len() && rTxtNode.GetFrm() && + if( rTxtNode.GetTxt().Len() && rTxtNode.getLayoutFrm( pDoc->GetCurrentLayout() ) && rTxtNode.GetNodes().IsDocNodes() && ( !IsFromChapter() || ::lcl_FindChapterNode( rTxtNode, 0 ) == pOwnChapterNode ) ) @@ -1345,9 +1347,8 @@ void SwTOXBaseSection::UpdateAuthorities( const SwTOXInternational& rIntl ) if(!pAuthFld) return; - SwClientIter aIter( *pAuthFld ); - SwFmtFld* pFmtFld = (SwFmtFld*)aIter.First( TYPE( SwFmtFld )); - for( ; pFmtFld; pFmtFld = (SwFmtFld*)aIter.Next() ) + SwIterator<SwFmtFld,SwFieldType> aIter( *pAuthFld ); + for( SwFmtFld* pFmtFld = aIter.First(); pFmtFld; pFmtFld = aIter.Next() ) { const SwTxtFld* pTxtFld = pFmtFld->GetTxtFld(); //undo @@ -1356,11 +1357,11 @@ void SwTOXBaseSection::UpdateAuthorities( const SwTOXInternational& rIntl ) const SwTxtNode& rTxtNode = pTxtFld->GetTxtNode(); ::SetProgressState( 0, pDoc->GetDocShell() ); - if( rTxtNode.GetTxt().Len() && rTxtNode.GetFrm() && + if( rTxtNode.GetTxt().Len() && rTxtNode.getLayoutFrm( pDoc->GetCurrentLayout() ) && rTxtNode.GetNodes().IsDocNodes() ) { //#106485# the body node has to be used! - SwCntntFrm *pFrm = rTxtNode.GetFrm(); + SwCntntFrm *pFrm = rTxtNode.getLayoutFrm( pDoc->GetCurrentLayout() ); SwPosition aFldPos(rTxtNode); const SwTxtNode* pTxtNode = 0; if(pFrm && !pFrm->IsInDocBody()) @@ -1506,7 +1507,7 @@ void SwTOXBaseSection::UpdateCntnt( SwTOXElement eMyType, } } - if( pCNd->GetFrm() && ( !IsFromChapter() || + if( pCNd->getLayoutFrm( pDoc->GetCurrentLayout() ) && ( !IsFromChapter() || ::lcl_FindChapterNode( *pCNd, 0 ) == pOwnChapterNode )) { SwTOXPara * pNew = new SwTOXPara( *pCNd, eMyType, @@ -1546,7 +1547,7 @@ void SwTOXBaseSection::UpdateTable( const SwTxtNode* pOwnChapterNode ) while( 0 != ( pCNd = rNds.GoNext( &aCntntIdx ) ) && aCntntIdx.GetIndex() < pTblNd->EndOfSectionIndex() ) { - if( pCNd->GetFrm() && (!IsFromChapter() || + if( pCNd->getLayoutFrm( pDoc->GetCurrentLayout() ) && (!IsFromChapter() || ::lcl_FindChapterNode( *pCNd, 0 ) == pOwnChapterNode )) { SwTOXTable * pNew = new SwTOXTable( *pCNd ); @@ -1683,7 +1684,7 @@ void SwTOXBaseSection::GenerateText( sal_uInt16 nArrayIdx, long nRightMargin; if( pPageDesc ) { - const SwFrm* pFrm = pTOXNd->GetFrm( 0, 0, sal_True ); + const SwFrm* pFrm = pTOXNd->getLayoutFrm( pDoc->GetCurrentLayout(), 0, 0, sal_True ); if( !pFrm || 0 == ( pFrm = pFrm->FindPageFrm() ) || pPageDesc != ((SwPageFrm*)pFrm)->GetPageDesc() ) // dann muss man ueber den PageDesc gehen @@ -1768,7 +1769,7 @@ void SwTOXBaseSection::GenerateText( sal_uInt16 nArrayIdx, if ( pTOXSource && pTOXSource->pNd && pTOXSource->pNd->IsCntntNode() ) { - const SwCntntFrm* pFrm = pTOXSource->pNd->GetFrm(); + const SwCntntFrm* pFrm = pTOXSource->pNd->getLayoutFrm( pDoc->GetCurrentLayout() ); if( pFrm ) { SwChapterFieldType aFldTyp; @@ -1941,7 +1942,7 @@ void SwTOXBaseSection::UpdatePageNum() SwTOXSource& rTOXSource = pSortBase->aTOXSources[j]; if( rTOXSource.pNd ) { - SwCntntFrm* pFrm = rTOXSource.pNd->GetFrm(); + SwCntntFrm* pFrm = rTOXSource.pNd->getLayoutFrm( pDoc->GetCurrentLayout() ); OSL_ENSURE( pFrm || pDoc->IsUpdateTOX(), "TOX, no Frame found"); if( !pFrm ) continue; diff --git a/sw/source/core/doc/fmtcol.cxx b/sw/source/core/doc/fmtcol.cxx index 04f3ffcdb008..be40cb0fb67f 100644 --- a/sw/source/core/doc/fmtcol.cxx +++ b/sw/source/core/doc/fmtcol.cxx @@ -36,16 +36,14 @@ #include <editeng/fhgtitem.hxx> #include <doc.hxx> // fuer GetAttrPool #include <fmtcol.hxx> -#include <fmtcolfunc.hxx> // #i71574# +#include <fmtcolfunc.hxx> #include <hints.hxx> #include <calc.hxx> #include <node.hxx> #include <numrule.hxx> #include <paratr.hxx> - -//--> #outlinelevel added by zhaojianwei +#include <switerator.hxx> #include <svl/intitem.hxx> -//<--end TYPEINIT1( SwTxtFmtColl, SwFmtColl ); TYPEINIT1( SwGrfFmtColl, SwFmtColl ); @@ -136,7 +134,7 @@ namespace TxtFmtCollFunc * SwTxtFmtColl TXT */ -void SwTxtFmtColl::Modify( SfxPoolItem* pOld, SfxPoolItem* pNew ) +void SwTxtFmtColl::Modify( const SfxPoolItem* pOld, const SfxPoolItem* pNew ) { if( GetDoc()->IsInDtor() ) { @@ -350,10 +348,10 @@ void SwTxtFmtColl::Modify( SfxPoolItem* pOld, SfxPoolItem* pNew ) sal_Bool SwTxtFmtColl::IsAtDocNodeSet() const { - SwClientIter aIter( *(SwModify*)this ); + SwIterator<SwCntntNode,SwFmtColl> aIter( *this ); const SwNodes& rNds = GetDoc()->GetNodes(); - for( SwClient* pC = aIter.First(TYPE(SwCntntNode)); pC; pC = aIter.Next() ) - if( &((SwCntntNode*)pC)->GetNodes() == &rNds ) + for( SwCntntNode* pNode = aIter.First(); pNode; pNode = aIter.Next() ) + if( &(pNode->GetNodes()) == &rNds ) return sal_True; return sal_False; @@ -534,6 +532,12 @@ SwCollCondition::~SwCollCondition() delete aSubCondition.pFldExpression; } +void SwCollCondition::RegisterToFormat( SwFmt& rFmt ) +{ + rFmt.Add( this ); +} + + int SwCollCondition::operator==( const SwCollCondition& rCmp ) const { @@ -671,9 +675,8 @@ void SwTxtFmtColl::AssignToListLevelOfOutlineStyle(const int nAssignedListLevel) SetAttrOutlineLevel(nAssignedListLevel+1); // #i100277# - SwClientIter aIter( *this ); - SwTxtFmtColl* pDerivedTxtFmtColl = - dynamic_cast<SwTxtFmtColl*>(aIter.First( TYPE( SwTxtFmtColl ) )); + SwIterator<SwTxtFmtColl,SwFmtColl> aIter( *this ); + SwTxtFmtColl* pDerivedTxtFmtColl = aIter.First(); while ( pDerivedTxtFmtColl != 0 ) { if ( !pDerivedTxtFmtColl->IsAssignedToListLevelOfOutlineStyle() ) @@ -689,7 +692,7 @@ void SwTxtFmtColl::AssignToListLevelOfOutlineStyle(const int nAssignedListLevel) } } - pDerivedTxtFmtColl = dynamic_cast<SwTxtFmtColl*>(aIter.Next()); + pDerivedTxtFmtColl = aIter.Next(); } // <-- } diff --git a/sw/source/core/doc/ftnidx.cxx b/sw/source/core/doc/ftnidx.cxx index e0e257505ba7..0304d41ddf3d 100644 --- a/sw/source/core/doc/ftnidx.cxx +++ b/sw/source/core/doc/ftnidx.cxx @@ -221,6 +221,8 @@ void SwFtnIdxs::UpdateAllFtn() SwUpdFtnEndNtAtEnd aNumArr; + SwRootFrm* pTmpRoot = pDoc->GetCurrentLayout();//swmod 080305 + std::set<SwRootFrm*> aAllLayouts = pDoc->GetAllLayouts(); //Fuer normale Fussnoten werden Chapter- und Dokumentweise Nummerierung //getrennt behandelt. Fuer Endnoten gibt es nur die Dokumentweise //Nummerierung. @@ -231,7 +233,6 @@ void SwFtnIdxs::UpdateAllFtn() nFtnIdx = 0; // Index in das FtnIdx-Array for( sal_uInt16 n = 0; n < rOutlNds.Count(); ++n ) { - //if( !rOutlNds[ n ]->GetTxtNode()->GetTxtColl()->GetOutlineLevel() )//#outline level,zhaojianwei if ( rOutlNds[ n ]->GetTxtNode()->GetAttrOutlineLevel() == 1 )//<-end,zhaojianwei { sal_uLong nCapStt = rOutlNds[ n ]->GetIndex(); // Start eines neuen Kapitels @@ -293,8 +294,8 @@ void SwFtnIdxs::UpdateAllFtn() } } - if( pDoc->GetRootFrm() && FTNNUM_PAGE == rFtnInfo.eNum ) - pDoc->GetRootFrm()->UpdateFtnNums(); + if( pTmpRoot && FTNNUM_PAGE == rFtnInfo.eNum ) + std::for_each( aAllLayouts.begin(), aAllLayouts.end(),std::mem_fun(&SwRootFrm::UpdateFtnNums));//swmod 0 } SwTxtFtn* SwFtnIdxs::SeekEntry( const SwNodeIndex& rPos, sal_uInt16* pFndPos ) const diff --git a/sw/source/core/doc/htmltbl.cxx b/sw/source/core/doc/htmltbl.cxx index 8252e86feb2b..0147bdce47ca 100644 --- a/sw/source/core/doc/htmltbl.cxx +++ b/sw/source/core/doc/htmltbl.cxx @@ -46,9 +46,10 @@ #include "poolfmt.hxx" #include "viewsh.hxx" #include "tabfrm.hxx" - +#include "viewopt.hxx" #include "htmltbl.hxx" #include "ndindex.hxx" +#include "switerator.hxx" using namespace ::com::sun::star; @@ -352,7 +353,7 @@ sal_uInt16 SwHTMLTableLayout::GetBrowseWidthByVisArea( const SwDoc& rDoc ) sal_uInt16 SwHTMLTableLayout::GetBrowseWidth( const SwDoc& rDoc ) { // Wenn ein Layout da ist, koennen wir die Breite dort herholen. - const SwRootFrm *pRootFrm = rDoc.GetRootFrm(); + const SwRootFrm *pRootFrm = rDoc.GetCurrentLayout(); //swmod 080218 if( pRootFrm ) { const SwFrm *pPageFrm = pRootFrm->GetLower(); @@ -403,11 +404,10 @@ sal_uInt16 SwHTMLTableLayout::GetBrowseWidthByTabFrm( sal_uInt16 SwHTMLTableLayout::GetBrowseWidthByTable( const SwDoc& rDoc ) const { sal_uInt16 nBrowseWidth = 0; - SwClientIter aIter( *(SwModify*)pSwTable->GetFrmFmt() ); - SwClient* pCli = aIter.First( TYPE( SwTabFrm )); - if( pCli ) + SwTabFrm* pFrm = SwIterator<SwTabFrm,SwFmt>::FirstElement( *pSwTable->GetFrmFmt() ); + if( pFrm ) { - nBrowseWidth = GetBrowseWidthByTabFrm( *(SwTabFrm*)pCli ); + nBrowseWidth = GetBrowseWidthByTabFrm( *pFrm ); } else { @@ -1737,16 +1737,16 @@ void SwHTMLTableLayout::_Resize( sal_uInt16 nAbsAvail, sal_Bool bRecalc ) if( bRecalc ) AutoLayoutPass1(); - SwRootFrm *pRoot = (SwRootFrm*)GetDoc()->GetRootFrm(); + SwRootFrm *pRoot = (SwRootFrm*)GetDoc()->GetCurrentViewShell()->GetLayout(); if ( pRoot && pRoot->IsCallbackActionEnabled() ) - pRoot->StartAllAction(); + pRoot->StartAllAction(); //swmod 071108//swmod 071225 // Sonst koennen die Breiten gesetzt werden, wobei zuvor aber jewils // noch der Pass 2 laufen muss. SetWidths( sal_True, nAbsAvail ); if ( pRoot && pRoot->IsCallbackActionEnabled() ) - pRoot->EndAllAction( sal_True ); //True per VirDev (Browsen ruhiger) + pRoot->EndAllAction( sal_True ); //True per VirDev (Browsen ruhiger) //swmod 071108//swmod 071225 } IMPL_STATIC_LINK( SwHTMLTableLayout, DelayedResize_Impl, void*, EMPTYARG ) @@ -1780,7 +1780,7 @@ sal_Bool SwHTMLTableLayout::Resize( sal_uInt16 nAbsAvail, sal_Bool bRecalc, // und nicht die der VisArea uebergeben. Wenn wir nicht in einem Rahmen // stehen, muss die Tabelle allerdings fuer die VisArea berechnet werden, // weil sond die Umschaltung von relativ nach absolut nicht funktioniert. - if( pDoc->GetRootFrm() && pDoc->get(IDocumentSettingAccess::BROWSE_MODE) ) + if( pDoc->GetCurrentViewShell() && pDoc->GetCurrentViewShell()->GetViewOptions()->getBrowseMode() ) { const sal_uInt16 nVisAreaWidth = GetBrowseWidthByVisArea( *pDoc ); if( nVisAreaWidth < nAbsAvail && !FindFlyFrmFmt() ) diff --git a/sw/source/core/doc/lineinfo.cxx b/sw/source/core/doc/lineinfo.cxx index 8addb27cf01e..3fa6e2e0867d 100644 --- a/sw/source/core/doc/lineinfo.cxx +++ b/sw/source/core/doc/lineinfo.cxx @@ -35,19 +35,22 @@ #include "poolfmt.hxx" #include "rootfrm.hxx" #include "viewsh.hxx" - +#include <set> void SwDoc::SetLineNumberInfo( const SwLineNumberInfo &rNew ) { - if ( GetRootFrm() && + SwRootFrm* pTmpRoot = GetCurrentLayout();//swmod 080219 + if ( pTmpRoot && (rNew.IsCountBlankLines() != pLineNumberInfo->IsCountBlankLines() || rNew.IsRestartEachPage() != pLineNumberInfo->IsRestartEachPage()) ) { - GetRootFrm()->StartAllAction(); + std::set<SwRootFrm*> aAllLayouts = GetAllLayouts();//swmod 080225 + pTmpRoot->StartAllAction(); // FME 2007-08-14 #i80120# Invalidate size, because ChgThisLines() // is only (onny may only be) called by the formatting routines - GetRootFrm()->InvalidateAllCntnt( INV_LINENUM | INV_SIZE ); - GetRootFrm()->EndAllAction(); - } + //pTmpRoot->InvalidateAllCntnt( INV_LINENUM | INV_SIZE ); + std::for_each( aAllLayouts.begin(), aAllLayouts.end(),std::bind2nd(std::mem_fun(&SwRootFrm::InvalidateAllCntnt), INV_LINENUM | INV_SIZE));//swmod 080226 + pTmpRoot->EndAllAction(); + } //swmod 080219 *pLineNumberInfo = rNew; SetModified(); } @@ -90,7 +93,7 @@ SwLineNumberInfo& SwLineNumberInfo::operator=(const SwLineNumberInfo &rCpy) if ( rCpy.GetRegisteredIn() ) ((SwModify*)rCpy.GetRegisteredIn())->Add( this ); else if ( GetRegisteredIn() ) - pRegisteredIn->Remove( this ); + GetRegisteredInNonConst()->Remove( this ); aType = rCpy.GetNumType(); aDivider = rCpy.GetDivider(); @@ -138,15 +141,17 @@ void SwLineNumberInfo::SetCharFmt( SwCharFmt *pChFmt ) pChFmt->Add( this ); } -void SwLineNumberInfo::Modify( SfxPoolItem* pOld, SfxPoolItem* pNew ) +void SwLineNumberInfo::Modify( const SfxPoolItem* pOld, const SfxPoolItem* pNew ) { - SwClient::Modify( pOld, pNew ); + CheckRegistration( pOld, pNew ); SwDoc *pDoc = ((SwCharFmt*)GetRegisteredIn())->GetDoc(); - SwRootFrm* pRoot = pDoc->GetRootFrm(); - if( pRoot && pRoot->GetCurrShell() ) + SwRootFrm* pRoot = pDoc->GetCurrentLayout(); + if( pRoot ) { pRoot->StartAllAction(); - pRoot->GetCurrShell()->AddPaintRect( pRoot->Frm() ); + std::set<SwRootFrm*> aAllLayouts = pDoc->GetAllLayouts(); + std::for_each( aAllLayouts.begin(), aAllLayouts.end(),std::mem_fun(&SwRootFrm::AllAddPaintRect));//swmod 080305 + //pRoot->GetCurrShell()->AddPaintRect( pRoot->Frm() ); pRoot->EndAllAction(); } } diff --git a/sw/source/core/doc/notxtfrm.cxx b/sw/source/core/doc/notxtfrm.cxx index 15aaccd7c9a1..d00e8d6415c8 100644 --- a/sw/source/core/doc/notxtfrm.cxx +++ b/sw/source/core/doc/notxtfrm.cxx @@ -155,8 +155,8 @@ void lcl_PaintReplacement( const SwRect &rRect, const String &rText, *************************************************************************/ -SwNoTxtFrm::SwNoTxtFrm(SwNoTxtNode * const pNode) - : SwCntntFrm(pNode) +SwNoTxtFrm::SwNoTxtFrm(SwNoTxtNode * const pNode, SwFrm* pSib ) + : SwCntntFrm( pNode, pSib ) { InitCtor(); } @@ -181,9 +181,9 @@ void SwNoTxtFrm::InitCtor() *************************************************************************/ -SwCntntFrm *SwNoTxtNode::MakeFrm() +SwCntntFrm *SwNoTxtNode::MakeFrm( SwFrm* pSib ) { - return new SwNoTxtFrm(this); + return new SwNoTxtFrm(this, pSib); } /************************************************************************* @@ -227,7 +227,7 @@ void lcl_ClearArea( const SwFrm &rFrm, else { rOut.Push( PUSH_FILLCOLOR|PUSH_LINECOLOR ); - rOut.SetFillColor( rFrm.GetShell()->Imp()->GetRetoucheColor()); + rOut.SetFillColor( rFrm.getRootFrm()->GetCurrShell()->Imp()->GetRetoucheColor()); rOut.SetLineColor(); for( sal_uInt16 i = 0; i < aRegion.Count(); ++i ) rOut.DrawRect( aRegion[i].SVRect() ); @@ -247,7 +247,7 @@ void SwNoTxtFrm::Paint(SwRect const& rRect, SwPrintData const*const) const if ( Frm().IsEmpty() ) return; - const ViewShell* pSh = GetShell(); + const ViewShell* pSh = getRootFrm()->GetCurrShell(); if( !pSh->GetViewOptions()->IsGraphic() ) { StopAnimation(); @@ -622,7 +622,7 @@ sal_Bool SwNoTxtFrm::GetCrsrOfst(SwPosition* pPos, Point& , }\ } -void SwNoTxtFrm::Modify( SfxPoolItem* pOld, SfxPoolItem* pNew ) +void SwNoTxtFrm::Modify( const SfxPoolItem* pOld, const SfxPoolItem* pNew ) { sal_uInt16 nWhich = pNew ? pNew->Which() : pOld ? pOld->Which() : 0; @@ -783,7 +783,7 @@ void lcl_correctlyAlignRect( SwRect& rAlignedGrfArea, const SwRect& rInArea, Out /// pixel-align coordinations for drawing graphic. void SwNoTxtFrm::PaintPicture( OutputDevice* pOut, const SwRect &rGrfArea ) const { - ViewShell* pShell = GetShell(); + ViewShell* pShell = getRootFrm()->GetCurrShell(); SwNoTxtNode& rNoTNd = *(SwNoTxtNode*)GetNode(); SwGrfNode* pGrfNd = rNoTNd.GetGrfNode(); @@ -1013,7 +1013,7 @@ void SwNoTxtFrm::PaintPicture( OutputDevice* pOut, const SwRect &rGrfArea ) cons sal_Bool SwNoTxtFrm::IsTransparent() const { - const ViewShell* pSh = GetShell(); + const ViewShell* pSh = getRootFrm()->GetCurrShell(); if ( !pSh || !pSh->GetViewOptions()->IsGraphic() ) return sal_True; diff --git a/sw/source/core/doc/number.cxx b/sw/source/core/doc/number.cxx index 73dcba920960..a5d12082f8fd 100644 --- a/sw/source/core/doc/number.cxx +++ b/sw/source/core/doc/number.cxx @@ -197,7 +197,7 @@ SwNumFmt::SwNumFmt() : SwNumFmt::SwNumFmt( const SwNumFmt& rFmt) : SvxNumberFormat(rFmt), - SwClient( rFmt.pRegisteredIn ), + SwClient( rFmt.GetRegisteredInNonConst() ), pVertOrient(new SwFmtVertOrient( 0, rFmt.GetVertOrient())) { sal_Int16 eMyVertOrient = rFmt.GetVertOrient(); @@ -227,7 +227,7 @@ SwNumFmt::SwNumFmt(const SvxNumberFormat& rNumFmt, SwDoc* pDoc) : pCFmt->Add( this ); } else if( GetRegisteredIn() ) - pRegisteredIn->Remove( this ); + GetRegisteredInNonConst()->Remove( this ); } @@ -276,16 +276,16 @@ SwNumFmt& SwNumFmt::operator=( const SwNumFmt& rNumFmt) { SvxNumberFormat::operator=(rNumFmt); if( rNumFmt.GetRegisteredIn() ) - rNumFmt.pRegisteredIn->Add( this ); + rNumFmt.GetRegisteredInNonConst()->Add( this ); else if( GetRegisteredIn() ) - pRegisteredIn->Remove( this ); + GetRegisteredInNonConst()->Remove( this ); return *this; } sal_Bool SwNumFmt::operator==( const SwNumFmt& rNumFmt) const { sal_Bool bRet = SvxNumberFormat::operator==(rNumFmt) && - pRegisteredIn == rNumFmt.pRegisteredIn; + GetRegisteredIn() == rNumFmt.GetRegisteredIn(); return bRet; } @@ -294,15 +294,16 @@ void SwNumFmt::SetCharFmt( SwCharFmt* pChFmt) if( pChFmt ) pChFmt->Add( this ); else if( GetRegisteredIn() ) - pRegisteredIn->Remove( this ); + GetRegisteredInNonConst()->Remove( this ); } -void SwNumFmt::Modify( SfxPoolItem* pOld, SfxPoolItem* pNew ) +void SwNumFmt::Modify( const SfxPoolItem* pOld, const SfxPoolItem* pNew ) { // dann suche mal in dem Doc nach dem NumRules-Object, in dem dieses // NumFormat gesetzt ist. Das Format muss es nicht geben! const SwCharFmt* pFmt = 0; - switch( pOld ? pOld->Which() : pNew ? pNew->Which() : 0 ) + sal_uInt16 nWhich = pOld ? pOld->Which() : pNew ? pNew->Which() : 0; + switch( nWhich ) { case RES_ATTRSET_CHG: case RES_FMT_CHG: @@ -313,7 +314,7 @@ void SwNumFmt::Modify( SfxPoolItem* pOld, SfxPoolItem* pNew ) if( pFmt && !pFmt->GetDoc()->IsInDtor() ) UpdateNumNodes( (SwDoc*)pFmt->GetDoc() ); else - SwClient::Modify( pOld, pNew ); + CheckRegistration( pOld, pNew ); } void SwNumFmt::SetCharFmtName(const String& rSet) @@ -323,12 +324,19 @@ void SwNumFmt::SetCharFmtName(const String& rSet) const String& SwNumFmt::GetCharFmtName() const { - if((SwCharFmt*)pRegisteredIn) - return ((SwCharFmt*)pRegisteredIn)->GetName(); + if((SwCharFmt*)GetRegisteredIn()) + return ((SwCharFmt*)GetRegisteredIn())->GetName(); else return aEmptyStr; } +void SwNumFmt::ForgetCharFmt() +{ + if ( GetRegisteredIn() ) + GetRegisteredInNonConst()->Remove( this ); +} + + void SwNumFmt::SetGraphicBrush( const SvxBrushItem* pBrushItem, const Size* pSize, const sal_Int16* pOrient) { diff --git a/sw/source/core/doc/poolfmt.cxx b/sw/source/core/doc/poolfmt.cxx index 8adea28c9971..d51ff0a2c947 100644 --- a/sw/source/core/doc/poolfmt.cxx +++ b/sw/source/core/doc/poolfmt.cxx @@ -1275,7 +1275,7 @@ SwFmt* SwDoc::GetFmtFromPool( sal_uInt16 nId ) case RES_POOLFRM_FRAME: { - if ( get(IDocumentSettingAccess::BROWSE_MODE) ) + if ( get(IDocumentSettingAccess::HTML_MODE) ) { aSet.Put( SwFmtAnchor( FLY_AS_CHAR )); aSet.Put( SwFmtVertOrient( 0, text::VertOrientation::LINE_CENTER, text::RelOrientation::PRINT_AREA ) ); diff --git a/sw/source/core/doc/swserv.cxx b/sw/source/core/doc/swserv.cxx index d6553658dd33..7290240d1151 100644 --- a/sw/source/core/doc/swserv.cxx +++ b/sw/source/core/doc/swserv.cxx @@ -327,7 +327,7 @@ SwDataChanged::~SwDataChanged() { // JP 09.04.96: nur wenn das Layout vorhanden ist ( also waehrend der // Eingabe) - if( pDoc->GetRootFrm() ) + if( pDoc->GetCurrentViewShell() ) //swmod 071108//swmod 071225 { const ::sfx2::SvLinkSources& rServers = pDoc->GetLinkManager().GetServers(); diff --git a/sw/source/core/doc/tblafmt.cxx b/sw/source/core/doc/tblafmt.cxx index 9d16beb1b4d0..54c0348339ef 100644..100755 --- a/sw/source/core/doc/tblafmt.cxx +++ b/sw/source/core/doc/tblafmt.cxx @@ -335,7 +335,7 @@ sal_Bool SwBoxAutoFmt::Load( SvStream& rStream, const SwAfVersions& rVersions, s READ( aFont, SvxFontItem , rVersions.nFontVersion) if( rStream.GetStreamCharSet() == aFont.GetCharSet() ) - aFont.GetCharSet() = ::gsl_getSystemTextEncoding(); + aFont.SetCharSet(::gsl_getSystemTextEncoding()); READ( aHeight, SvxFontHeightItem , rVersions.nFontHeightVersion) READ( aWeight, SvxWeightItem , rVersions.nWeightVersion) @@ -423,7 +423,7 @@ sal_Bool SwBoxAutoFmt::LoadOld( SvStream& rStream, sal_uInt16 aLoadVer[] ) READ( aFont, SvxFontItem , 0) if( rStream.GetStreamCharSet() == aFont.GetCharSet() ) - aFont.GetCharSet() = ::gsl_getSystemTextEncoding(); + aFont.SetCharSet(::gsl_getSystemTextEncoding()); READ( aHeight, SvxFontHeightItem , 1) READ( aWeight, SvxWeightItem , 2) diff --git a/sw/source/core/doc/tblrwcl.cxx b/sw/source/core/doc/tblrwcl.cxx index f20ef5bbdedd..5cdc3d5dc850 100644 --- a/sw/source/core/doc/tblrwcl.cxx +++ b/sw/source/core/doc/tblrwcl.cxx @@ -63,6 +63,7 @@ #include <tblrwcl.hxx> #include <unochart.hxx> #include <boost/shared_ptr.hpp> +#include <switerator.hxx> using namespace com::sun::star; using namespace com::sun::star::uno; @@ -208,20 +209,14 @@ void _CheckBoxWidth( const SwTableLine& rLine, SwTwips nSize ); for ( sal_uInt16 i = 0; i < GetTabLines().Count(); ++i ) \ { \ SwFrmFmt* pFmt = GetTabLines()[i]->GetFrmFmt(); \ - SwClientIter aIter( *pFmt ); \ - SwClient* pLast = aIter.GoStart(); \ - if( pLast ) \ + SwIterator<SwRowFrm,SwFmt> aIter( *pFmt ); \ + for (SwRowFrm* pFrm=aIter.First(); pFrm; pFrm=aIter.Next())\ { \ - do \ - { \ - SwFrm *pFrm = PTR_CAST( SwFrm, pLast ); \ - if ( pFrm && \ - ((SwRowFrm*)pFrm)->GetTabLine() == GetTabLines()[i] ) \ + if ( pFrm->GetTabLine() == GetTabLines()[i] ) \ { \ OSL_ENSURE( pFrm->GetUpper()->IsTabFrm(), \ "Table layout does not match table structure" ); \ } \ - } while ( 0 != ( pLast = aIter++ ) ); \ } \ } \ } @@ -520,11 +515,10 @@ void lcl_InsCol( _FndLine* pFndLn, _CpyPara& rCpyPara, sal_uInt16 nCpyCnt, SwRowFrm* GetRowFrm( SwTableLine& rLine ) { - SwClientIter aIter( *rLine.GetFrmFmt() ); - for( SwClient* pFrm = aIter.First( TYPE( SwRowFrm )); pFrm; - pFrm = aIter.Next() ) - if( ((SwRowFrm*)pFrm)->GetTabLine() == &rLine ) - return (SwRowFrm*)pFrm; + SwIterator<SwRowFrm,SwFmt> aIter( *rLine.GetFrmFmt() ); + for( SwRowFrm* pFrm = aIter.First(); pFrm; pFrm = aIter.Next() ) + if( pFrm->GetTabLine() == &rLine ) + return pFrm; return 0; } @@ -619,7 +613,7 @@ sal_Bool SwTable::_InsertRow( SwDoc* pDoc, const SwSelBoxes& rBoxes, //Lines fuer das Layout-Update herausuchen. const sal_Bool bLayout = !IsNewModel() && - 0 != SwClientIter( *GetFrmFmt() ).First( TYPE(SwTabFrm) ); + 0 != SwIterator<SwTabFrm,SwFmt>::FirstElement( *GetFrmFmt() ); if ( bLayout ) { @@ -739,7 +733,7 @@ sal_Bool SwTable::AppendRow( SwDoc* pDoc, sal_uInt16 nCnt ) SetHTMLTableLayout( 0 ); // MIB 9.7.97: HTML-Layout loeschen //Lines fuer das Layout-Update herausuchen. - const sal_Bool bLayout = 0 != SwClientIter( *GetFrmFmt() ).First( TYPE(SwTabFrm) ); + bool bLayout = 0 != SwIterator<SwTabFrm,SwFmt>::FirstElement( *GetFrmFmt() ); if( bLayout ) { aFndBox.SetTableLines( *this ); @@ -3715,8 +3709,7 @@ sal_Bool SwTable::SetColWidth( SwTableBox& rAktBox, sal_uInt16 eType, if( GetFrmFmt()->getIDocumentSettingAccess()->get(IDocumentSettingAccess::BROWSE_MODE) && !rSz.GetWidthPercent() ) { - SwTabFrm* pTabFrm = (SwTabFrm*)SwClientIter( - *GetFrmFmt() ).First( TYPE( SwTabFrm )); + SwTabFrm* pTabFrm = SwIterator<SwTabFrm,SwFmt>::FirstElement( *GetFrmFmt() ); if( pTabFrm && pTabFrm->Prt().Width() != rSz.GetWidth() ) { diff --git a/sw/source/core/doc/visiturl.cxx b/sw/source/core/doc/visiturl.cxx index a39ced3f767e..b269451ac512 100644 --- a/sw/source/core/doc/visiturl.cxx +++ b/sw/source/core/doc/visiturl.cxx @@ -55,7 +55,7 @@ SwURLStateChanged::~SwURLStateChanged() void SwURLStateChanged::Notify( SfxBroadcaster& , const SfxHint& rHint ) { - if( rHint.ISA( INetURLHistoryHint ) && pDoc->GetRootFrm() ) + if( rHint.ISA( INetURLHistoryHint ) && pDoc->GetCurrentViewShell() ) //swmod 071108//swmod 071225 { // diese URL wurde veraendert: const INetURLObject* pIURL = ((INetURLHistoryHint&)rHint).GetObject(); @@ -93,7 +93,7 @@ void SwURLStateChanged::Notify( SfxBroadcaster& , const SfxHint& rHint ) SwUpdateAttr aUpdateAttr( *pAttr->GetStart(), *pAttr->GetEnd(), RES_FMT_CHG ); - ((SwTxtNode*)pTxtNd)->Modify( &aUpdateAttr, &aUpdateAttr ); + ((SwTxtNode*)pTxtNd)->ModifyNotification( &aUpdateAttr, &aUpdateAttr ); } if( bAction ) diff --git a/sw/source/core/docnode/ndcopy.cxx b/sw/source/core/docnode/ndcopy.cxx index 156529b38f56..090c9654b501 100644 --- a/sw/source/core/docnode/ndcopy.cxx +++ b/sw/source/core/docnode/ndcopy.cxx @@ -437,7 +437,7 @@ SwTableNode* SwTableNode::MakeCopy( SwDoc* pDoc, const SwNodeIndex& rIdx ) const SwNodeIndex aInsPos( *pEndNd ); SwTable& rTbl = (SwTable&)pTblNd->GetTable(); - pTblFmt->Add( &rTbl ); // das Frame-Format setzen + rTbl.RegisterToFormat( *pTblFmt ); rTbl.SetRowsToRepeat( GetTable().GetRowsToRepeat() ); rTbl.SetTblChgMode( GetTable().GetTblChgMode() ); diff --git a/sw/source/core/docnode/ndsect.cxx b/sw/source/core/docnode/ndsect.cxx index 8adee6831112..00cee7bacd14 100644 --- a/sw/source/core/docnode/ndsect.cxx +++ b/sw/source/core/docnode/ndsect.cxx @@ -29,7 +29,7 @@ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_sw.hxx" - +#include <svl/smplhint.hxx> #include <hintids.hxx> #include <sfx2/linkmgr.hxx> #include <svl/itemiter.hxx> @@ -573,7 +573,7 @@ void SwDoc::DelSectionFmt( SwSectionFmt *pFmt, sal_Bool bDelNodes ) { SwPtrMsgPoolItem aMsgHint( RES_REMOVE_UNO_OBJECT, pFmt ); - pFmt->Modify( &aMsgHint, &aMsgHint ); + pFmt->ModifyNotification( &aMsgHint, &aMsgHint ); } // A ClearRedo could result in a rekursive call of this function and delete some section @@ -785,7 +785,7 @@ void lcl_DeleteFtn( SwSectionNode *pNd, sal_uLong nStt, sal_uLong nEnd ) // Werden die Nodes nicht geloescht mussen sie bei den Seiten // abmeldet (Frms loeschen) werden, denn sonst bleiben sie // stehen (Undo loescht sie nicht!) - pSrch->DelFrms(); + pSrch->DelFrms(0); ++nPos; } @@ -795,7 +795,7 @@ void lcl_DeleteFtn( SwSectionNode *pNd, sal_uLong nStt, sal_uLong nEnd ) // Werden die Nodes nicht geloescht mussen sie bei den Seiten // abmeldet (Frms loeschen) werden, denn sonst bleiben sie // stehen (Undo loescht sie nicht!) - pSrch->DelFrms(); + pSrch->DelFrms(0); } } } @@ -920,7 +920,7 @@ SwSectionNode* SwNodes::InsertTextSection(SwNodeIndex const& rNdIdx, // Hier bietet sich als Optimierung an, vorhandene Frames nicht zu // zerstoeren und wieder neu anzulegen, sondern nur umzuhaengen. sal_Bool bInsFrm = bCreateFrms && !pSectNd->GetSection().IsHidden() && - GetDoc()->GetRootFrm(); + GetDoc()->GetCurrentViewShell(); //swmod 071108//swmod 071225 SwNode2Layout *pNode2Layout = NULL; if( bInsFrm ) { @@ -1065,22 +1065,8 @@ SwFrm* SwClearDummies( SwFrm* pFrm ) SwSectionNode::~SwSectionNode() { - { - SwClientIter aIter( *(m_pSection->GetFmt()) ); - SwClient *pLast = aIter.GoStart(); - while ( pLast ) - { - if ( pLast->IsA( TYPE(SwFrm) ) ) - { - SwSectionFrm *pSectFrm = (SwSectionFrm*)pLast; - SwSectionFrm::MoveCntntAndDelete( pSectFrm, sal_True ); - pLast = aIter.GoStart(); - } - else - pLast = aIter++; - } - } - + // mba: test if iteration works as clients will be removed in callback + m_pSection->GetFmt()->CallSwClientNotify( SfxSimpleHint( SFX_HINT_DYING ) ); SwSectionFmt* pFmt = m_pSection->GetFmt(); if( pFmt ) { @@ -1093,10 +1079,10 @@ SwSectionNode::~SwSectionNode() } -SwFrm *SwSectionNode::MakeFrm() +SwFrm *SwSectionNode::MakeFrm( SwFrm *pSib ) { m_pSection->m_Data.SetHiddenFlag(false); - return new SwSectionFrm( *m_pSection ); + return new SwSectionFrm( *m_pSection, pSib ); } //Methode erzeugt fuer den vorhergehenden Node alle Ansichten vom @@ -1106,7 +1092,7 @@ void SwSectionNode::MakeFrms(const SwNodeIndex & rIdx ) { // also nehme meinen nachfolgenden oder vorhergehenden ContentFrame: SwNodes& rNds = GetNodes(); - if( rNds.IsDocNodes() && rNds.GetDoc()->GetRootFrm() ) + if( rNds.IsDocNodes() && rNds.GetDoc()->GetCurrentViewShell() ) //swmod 071108//swmod 071225 { if( GetSection().IsHidden() || IsCntntHidden() ) { @@ -1128,7 +1114,7 @@ void SwSectionNode::MakeFrms(const SwNodeIndex & rIdx ) while( 0 != (pFrm = aNode2Layout.NextFrm()) ) { OSL_ENSURE( pFrm->IsSctFrm(), "Depend von Section keine Section." ); - pNew = rIdx.GetNode().GetCntntNode()->MakeFrm(); + pNew = rIdx.GetNode().GetCntntNode()->MakeFrm( pFrm ); SwSectionNode* pS = rIdx.GetNode().FindSectionNode(); @@ -1150,7 +1136,7 @@ void SwSectionNode::MakeFrms(const SwNodeIndex & rIdx ) bool bInitNewSect = false; if( pS ) { - SwSectionFrm *pSct = new SwSectionFrm( pS->GetSection() ); + SwSectionFrm *pSct = new SwSectionFrm( pS->GetSection(), pFrm ); // prepare <Init()> of new section frame. bInitNewSect = true; SwLayoutFrm* pUp = pSct; @@ -1167,7 +1153,7 @@ void SwSectionNode::MakeFrms(const SwNodeIndex & rIdx ) // and relation CONTENT_FLOWS_TO for previous paragraph will change. if ( pNew->IsTxtFrm() ) { - ViewShell* pViewShell( pNew->GetShell() ); + ViewShell* pViewShell( pNew->getRootFrm()->GetCurrShell() ); if ( pViewShell && pViewShell->GetLayout() && pViewShell->GetLayout()->IsAnyShellAccessible() ) { @@ -1194,7 +1180,7 @@ void SwSectionNode::MakeFrms(const SwNodeIndex & rIdx ) // and relation CONTENT_FLOWS_TO for previous paragraph will change. if ( pNew->IsTxtFrm() ) { - ViewShell* pViewShell( pNew->GetShell() ); + ViewShell* pViewShell( pNew->getRootFrm()->GetCurrShell() ); if ( pViewShell && pViewShell->GetLayout() && pViewShell->GetLayout()->IsAnyShellAccessible() ) { @@ -1333,7 +1319,7 @@ SwSectionNode* SwSectionNode::MakeCopy( SwDoc* pDoc, const SwNodeIndex& rIdx ) c // dann kopiere auch noch die Links/Server if( pNewSect->IsLinkType() ) // den Link eintragen - pNewSect->CreateLink( pDoc->GetRootFrm() ? CREATE_CONNECT + pNewSect->CreateLink( pDoc->GetCurrentViewShell() ? CREATE_CONNECT //swmod 071108//swmod 071225 : CREATE_NONE ); // falls als Server aus dem Undo kopiert wird, wieder eintragen @@ -1388,7 +1374,7 @@ void SwSectionNode::NodesArrChgd() if( !rNds.IsDocNodes() ) { SwPtrMsgPoolItem aMsgHint( RES_REMOVE_UNO_OBJECT, pFmt ); - pFmt->Modify( &aMsgHint, &aMsgHint ); + pFmt->ModifyNotification( &aMsgHint, &aMsgHint ); } pFmt->LockModify(); @@ -1415,12 +1401,9 @@ void SwSectionNode::NodesArrChgd() { OSL_ENSURE( pDoc == GetDoc(), "verschieben in unterschiedliche Documente?" ); - if (m_pSection->IsLinkType()) - { - m_pSection->CreateLink( pDoc->GetRootFrm() ? CREATE_CONNECT - : CREATE_NONE ); - } - + if( m_pSection->IsLinkType() ) // den Link austragen + m_pSection->CreateLink( pDoc->GetCurrentViewShell() ? CREATE_CONNECT //swmod 071108 + : CREATE_NONE );//swmod 071225 if (m_pSection->IsServer()) { pDoc->GetLinkManager().InsertServer( m_pSection->GetObject() ); diff --git a/sw/source/core/docnode/ndtbl.cxx b/sw/source/core/docnode/ndtbl.cxx index d1d7af788bfe..8a757a1b2537 100644 --- a/sw/source/core/docnode/ndtbl.cxx +++ b/sw/source/core/docnode/ndtbl.cxx @@ -30,9 +30,7 @@ #include "precompiled_sw.hxx" #include <com/sun/star/chart2/XChartDocument.hpp> - #include <hintids.hxx> - #include <editeng/lrspitem.hxx> #include <editeng/brkitem.hxx> #include <editeng/protitem.hxx> @@ -91,15 +89,13 @@ #include <comcore.hrc> #include "docsh.hxx" #include <unochart.hxx> - #include <node.hxx> #include <ndtxt.hxx> - #include <map> #include <algorithm> -#include <rootfrm.hxx> // #i27138# +#include <rootfrm.hxx> #include <fldupde.hxx> - +#include <switerator.hxx> #if OSL_DEBUG_LEVEL > 1 #define CHECK_TABLE(t) (t).CheckConsistency(); #else @@ -471,7 +467,7 @@ const SwTable* SwDoc::InsertTable( const SwInsertTableOptions& rInsTblOpts, } SwTable * pNdTbl = &pTblNd->GetTable(); - pTableFmt->Add( pNdTbl ); // das Frame-Format setzen + pNdTbl->RegisterToFormat( *pTableFmt ); pNdTbl->SetRowsToRepeat( nRowsToRepeat ); pNdTbl->SetTableModel( bNewModel ); @@ -759,7 +755,7 @@ const SwTable* SwDoc::TextToTable( const SwInsertTableOptions& rInsTblOpts, //Orientation am Fmt der Table setzen pTableFmt->SetFmtAttr( SwFmtHoriOrient( 0, eAdjust ) ); - pTableFmt->Add( pNdTbl ); // das Frame-Format setzen + pNdTbl->RegisterToFormat( *pTableFmt ); if( pTAFmt || ( rInsTblOpts.mnInsMode & tabopts::DEFAULT_BORDER) ) { @@ -923,7 +919,7 @@ SwTableNode* SwNodes::TextToTable( const SwNodeRange& rRange, sal_Unicode cCh, // JP 28.10.96: vom 1. Node die Positionen des Trenners besorgen, // damit die Boxen entsprechend eingestellt werden - SwTxtFrmInfo aFInfo( (SwTxtFrm*)pTxtNd->GetFrm() ); + SwTxtFrmInfo aFInfo( (SwTxtFrm*)pTxtNd->getLayoutFrm( pTxtNd->GetDoc()->GetCurrentLayout() ) ); if( aFInfo.IsOneLine() ) // nur dann sinnvoll! { const sal_Unicode* pTxt = pTxtNd->GetTxt().GetBuffer(); @@ -1179,7 +1175,7 @@ const SwTable* SwDoc::TextToTable( const std::vector< std::vector<SwNodeRange> > SwTable * pNdTbl = &pTblNd->GetTable(); OSL_ENSURE( pNdTbl, "kein Tabellen-Node angelegt." ); - pTableFmt->Add( pNdTbl ); // das Frame-Format setzen + pNdTbl->RegisterToFormat( *pTableFmt ); if( !pBoxFmt->GetDepends() ) { @@ -2334,14 +2330,14 @@ SwTableNode::~SwTableNode() SwFrmFmt* pTblFmt = GetTable().GetFrmFmt(); SwPtrMsgPoolItem aMsgHint( RES_REMOVE_UNO_OBJECT, pTblFmt ); - pTblFmt->Modify( &aMsgHint, &aMsgHint ); + pTblFmt->ModifyNotification( &aMsgHint, &aMsgHint ); DelFrms(); delete pTable; } -SwTabFrm *SwTableNode::MakeFrm() +SwTabFrm *SwTableNode::MakeFrm( SwFrm* pSib ) { - return new SwTabFrm( *pTable ); + return new SwTabFrm( *pTable, pSib ); } //Methode erzeugt fuer den vorhergehenden Node alle Ansichten vom @@ -2363,7 +2359,7 @@ void SwTableNode::MakeFrms(const SwNodeIndex & rIdx ) while( 0 != (pFrm = aNode2Layout.NextFrm()) ) { - pNew = pNode->MakeFrm(); + pNew = pNode->MakeFrm( pFrm ); // wird ein Node vorher oder nachher mit Frames versehen if ( bBefore ) // der neue liegt vor mir @@ -2390,7 +2386,7 @@ void SwTableNode::MakeFrms( SwNodeIndex* pIdxBehind ) SwNode2Layout aNode2Layout( *pNd, GetIndex() ); while( 0 != (pUpper = aNode2Layout.UpperFrm( pFrm, *this )) ) { - SwTabFrm* pNew = MakeFrm(); + SwTabFrm* pNew = MakeFrm( pUpper ); pNew->Paste( pUpper, pFrm ); // #i27138# // notify accessibility paragraphs objects about changed @@ -2398,7 +2394,7 @@ void SwTableNode::MakeFrms( SwNodeIndex* pIdxBehind ) // Relation CONTENT_FLOWS_FROM for next paragraph will change // and relation CONTENT_FLOWS_TO for previous paragraph will change. { - ViewShell* pViewShell( pNew->GetShell() ); + ViewShell* pViewShell( pNew->getRootFrm()->GetCurrShell() ); if ( pViewShell && pViewShell->GetLayout() && pViewShell->GetLayout()->IsAnyShellAccessible() ) { @@ -2420,14 +2416,12 @@ void SwTableNode::DelFrms() //Sie muessen etwas umstaendlich zerstort werden, damit die Master //die Follows mit in's Grab nehmen. - SwClientIter aIter( *(pTable->GetFrmFmt()) ); - SwClient *pLast = aIter.GoStart(); - while ( pLast ) + SwIterator<SwTabFrm,SwFmt> aIter( *(pTable->GetFrmFmt()) ); + SwTabFrm *pFrm = aIter.First(); + while ( pFrm ) { sal_Bool bAgain = sal_False; - if ( pLast->IsA( TYPE(SwFrm) ) ) { - SwTabFrm *pFrm = (SwTabFrm*)pLast; if ( !pFrm->IsFollow() ) { while ( pFrm->HasFollow() ) @@ -2438,7 +2432,7 @@ void SwTableNode::DelFrms() // Relation CONTENT_FLOWS_FROM for current next paragraph will change // and relation CONTENT_FLOWS_TO for current previous paragraph will change. { - ViewShell* pViewShell( pFrm->GetShell() ); + ViewShell* pViewShell( pFrm->getRootFrm()->GetCurrShell() ); if ( pViewShell && pViewShell->GetLayout() && pViewShell->GetLayout()->IsAnyShellAccessible() ) { @@ -2453,7 +2447,7 @@ void SwTableNode::DelFrms() bAgain = sal_True; } } - pLast = bAgain ? aIter.GoStart() : aIter++; + pFrm = bAgain ? aIter.First() : aIter.Next(); } } @@ -2493,7 +2487,7 @@ void SwDoc::GetTabCols( SwTabCols &rFill, const SwCursor* pCrsr, if( pShCrsr ) aPt = pShCrsr->GetPtPos(); - const SwFrm* pTmpFrm = pCNd->GetFrm( &aPt, 0, sal_False ); + const SwFrm* pTmpFrm = pCNd->getLayoutFrm( pCNd->GetDoc()->GetCurrentLayout(), &aPt, 0, sal_False ); do { pTmpFrm = pTmpFrm->GetUpper(); } while ( !pTmpFrm->IsCellFrm() ); @@ -2715,7 +2709,7 @@ void SwDoc::SetTabCols( const SwTabCols &rNew, sal_Bool bCurRowOnly, if( pShCrsr ) aPt = pShCrsr->GetPtPos(); - const SwFrm* pTmpFrm = pCNd->GetFrm( &aPt, 0, sal_False ); + const SwFrm* pTmpFrm = pCNd->getLayoutFrm( pCNd->GetDoc()->GetCurrentLayout(), &aPt, 0, sal_False ); do { pTmpFrm = pTmpFrm->GetUpper(); } while ( !pTmpFrm->IsCellFrm() ); @@ -2924,7 +2918,7 @@ void SwDoc::SetRowsToRepeat( SwTable &rTable, sal_uInt16 nSet ) SwMsgPoolItem aChg( RES_TBLHEADLINECHG ); rTable.SetRowsToRepeat( nSet ); - rTable.GetFrmFmt()->Modify( &aChg, &aChg ); + rTable.GetFrmFmt()->ModifyNotification( &aChg, &aChg ); SetModified(); } @@ -3448,7 +3442,7 @@ SwTableNode* SwNodes::SplitTable( const SwNodeIndex& rPos, sal_Bool bAfter, pOldTblFmt->GetDoc()->GetDfltFrmFmt() ); *pNewTblFmt = *pOldTblFmt; - pNewTblFmt->Add( &pNewTblNd->GetTable() ); + pNewTblNd->GetTable().RegisterToFormat( *pNewTblFmt ); // neue Size errechnen ? (lcl_ChgTblSize nur das 2. aufrufen, wenn es // beim 1. schon geklappt hat; also absolute Groesse hat) diff --git a/sw/source/core/docnode/ndtbl1.cxx b/sw/source/core/docnode/ndtbl1.cxx index 14fac9d60f93..bdb3e5732bca 100644 --- a/sw/source/core/docnode/ndtbl1.cxx +++ b/sw/source/core/docnode/ndtbl1.cxx @@ -56,9 +56,10 @@ #include "swtblfmt.hxx" #include "docary.hxx" #include "ndindex.hxx" +#include "undobj.hxx" +#include "switerator.hxx" #include <UndoTable.hxx> - using namespace ::com::sun::star; @@ -123,8 +124,8 @@ void lcl_GetStartEndCell( const SwCursor& rCrsr, SwCntntNode* pPointNd = rCrsr.GetCntntNode(); SwCntntNode* pMarkNd = rCrsr.GetCntntNode(sal_False); - SwFrm* pPointFrm = pPointNd ? pPointNd->GetFrm( &aPtPos ) : 0; - SwFrm* pMarkFrm = pMarkNd ? pMarkNd->GetFrm( &aMkPos ) : 0; + SwFrm* pPointFrm = pPointNd ? pPointNd->getLayoutFrm( pPointNd->GetDoc()->GetCurrentLayout(), &aPtPos ) : 0; + SwFrm* pMarkFrm = pMarkNd ? pMarkNd->getLayoutFrm( pMarkNd->GetDoc()->GetCurrentLayout(), &aMkPos ) : 0; prStart = pPointFrm ? pPointFrm->GetUpper() : 0; prEnd = pMarkFrm ? pMarkFrm->GetUpper() : 0; @@ -456,12 +457,12 @@ sal_Bool SwDoc::BalanceRowHeight( const SwCursor& rCursor, sal_Bool bTstOnly ) for ( i = 0; i < aRowArr.Count(); ++i ) { - SwClientIter aIter( *((SwTableLine*)aRowArr[i])->GetFrmFmt() ); - SwFrm* pFrm = (SwFrm*)aIter.First( TYPE(SwFrm) ); + SwIterator<SwFrm,SwFmt> aIter( *((SwTableLine*)aRowArr[i])->GetFrmFmt() ); + SwFrm* pFrm = aIter.First(); while ( pFrm ) { nHeight = Max( nHeight, pFrm->Frm().Height() ); - pFrm = (SwFrm*)aIter.Next(); + pFrm = aIter.Next(); } } SwFmtFrmSize aNew( ATT_MIN_SIZE, 0, nHeight ); @@ -790,7 +791,7 @@ void SwDoc::SetTabBorders( const SwCursor& rCursor, const SfxItemSet& rSet ) SwHTMLTableLayout *pTableLayout = rTable.GetHTMLTableLayout(); if( pTableLayout ) { - SwCntntFrm* pFrm = rCursor.GetCntntNode()->GetFrm(); + SwCntntFrm* pFrm = rCursor.GetCntntNode()->getLayoutFrm( rCursor.GetCntntNode()->GetDoc()->GetCurrentLayout() ); SwTabFrm* pTabFrm = pFrm->ImplFindTabFrm(); pTableLayout->BordersChanged( @@ -886,7 +887,7 @@ void SwDoc::SetTabLineStyle( const SwCursor& rCursor, SwHTMLTableLayout *pTableLayout = rTable.GetHTMLTableLayout(); if( pTableLayout ) { - SwCntntFrm* pFrm = rCursor.GetCntntNode()->GetFrm(); + SwCntntFrm* pFrm = rCursor.GetCntntNode()->getLayoutFrm( rCursor.GetCntntNode()->GetDoc()->GetCurrentLayout() ); SwTabFrm* pTabFrm = pFrm->ImplFindTabFrm(); pTableLayout->BordersChanged( @@ -1143,7 +1144,7 @@ void SwDoc::SetBoxAttr( const SwCursor& rCursor, const SfxPoolItem &rNew ) SwHTMLTableLayout *pTableLayout = rTable.GetHTMLTableLayout(); if( pTableLayout ) { - SwCntntFrm* pFrm = rCursor.GetCntntNode()->GetFrm(); + SwCntntFrm* pFrm = rCursor.GetCntntNode()->getLayoutFrm( rCursor.GetCntntNode()->GetDoc()->GetCurrentLayout() ); SwTabFrm* pTabFrm = pFrm->ImplFindTabFrm(); pTableLayout->Resize( diff --git a/sw/source/core/docnode/node.cxx b/sw/source/core/docnode/node.cxx index 792f4ffaa4ce..26521624abb7 100644 --- a/sw/source/core/docnode/node.cxx +++ b/sw/source/core/docnode/node.cxx @@ -29,10 +29,8 @@ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_sw.hxx" - #include <hintids.hxx> - -#include <editeng/frmdiritem.hxx> // #i42921# +#include <editeng/frmdiritem.hxx> #include <editeng/protitem.hxx> #include <com/sun/star/i18n/CharacterIteratorMode.hdl> #include <fmtcntnt.hxx> @@ -70,9 +68,11 @@ #include <crsskip.hxx> #include <SwStyleNameMapper.hxx> #include <scriptinfo.hxx> -#include <rootfrm.hxx> // #i27138# +#include <rootfrm.hxx> #include <istyleaccess.hxx> -#include <IDocumentListItems.hxx> // #i83479# +#include <IDocumentListItems.hxx> +#include <switerator.hxx> +#include "ndole.hxx" using namespace ::com::sun::star::i18n; @@ -432,15 +432,16 @@ sal_Bool SwNode::IsInVisibleArea( ViewShell* pSh ) const else pNd = GetCntntNode(); - const SwFrm* pFrm; - if( pNd && 0 != ( pFrm = pNd->GetFrm( 0, 0, sal_False ) ) ) - { - if( !pSh ) - // dann die Shell vom Doc besorgen: - GetDoc()->GetEditShell( &pSh ); + if( !pSh ) + // dann die Shell vom Doc besorgen: + GetDoc()->GetEditShell( &pSh ); - if( pSh ) + if( pSh ) + { + const SwFrm* pFrm; + if( pNd && 0 != ( pFrm = pNd->getLayoutFrm( pSh->GetLayout(), 0, 0, sal_False ) ) ) { + if ( pFrm->IsInTab() ) pFrm = pFrm->FindTabFrm(); @@ -477,7 +478,7 @@ sal_Bool SwNode::IsProtect() const if( 0 != ( pSttNd = FindTableBoxStartNode() ) ) { SwCntntFrm* pCFrm; - if( IsCntntNode() && 0 != (pCFrm = ((SwCntntNode*)this)->GetFrm() )) + if( IsCntntNode() && 0 != (pCFrm = ((SwCntntNode*)this)->getLayoutFrm( GetDoc()->GetCurrentLayout() ) )) return pCFrm->IsProtected(); const SwTableBox* pBox = pSttNd->FindTableNode()->GetTable(). @@ -545,7 +546,7 @@ const SwPageDesc* SwNode::FindPageDesc( sal_Bool bCalcLay, { const SwFrm* pFrm; const SwPageFrm* pPage; - if( pNode && 0 != ( pFrm = pNode->GetFrm( 0, 0, bCalcLay ) ) && + if( pNode && 0 != ( pFrm = pNode->getLayoutFrm( pNode->GetDoc()->GetCurrentLayout(), 0, 0, bCalcLay ) ) && 0 != ( pPage = pFrm->FindPageFrm() ) ) { pPgDesc = pPage->GetPageDesc(); @@ -767,10 +768,9 @@ SwFrmFmt* SwNode::GetFlyFmt() const { if( IsCntntNode() ) { - SwClientIter aIter( *(SwCntntNode*)this ); - SwClient* pCli = aIter.First( TYPE( SwCntntFrm )); - if( pCli ) - pRet = ((SwCntntFrm*)pCli)->FindFlyFrm()->GetFmt(); + SwCntntFrm* pFrm = SwIterator<SwCntntFrm,SwCntntNode>::FirstElement( *(SwCntntNode*)this ); + if( pFrm ) + pRet = pFrm->FindFlyFrm()->GetFmt(); } if( !pRet ) { @@ -842,8 +842,8 @@ const SwTxtNode* SwNode::FindOutlineNodeOfLevel( sal_uInt8 nLvl ) const const SwCntntNode* pCNd = GetCntntNode(); Point aPt( 0, 0 ); - const SwFrm* pFrm = pRet->GetFrm( &aPt, 0, sal_False ), - * pMyFrm = pCNd ? pCNd->GetFrm( &aPt, 0, sal_False ) : 0; + const SwFrm* pFrm = pRet->getLayoutFrm( pRet->GetDoc()->GetCurrentLayout(), &aPt, 0, sal_False ), + * pMyFrm = pCNd ? pCNd->getLayoutFrm( pCNd->GetDoc()->GetCurrentLayout(), &aPt, 0, sal_False ) : 0; const SwPageFrm* pPgFrm = pFrm ? pFrm->FindPageFrm() : 0; if( pPgFrm && pMyFrm && pPgFrm->Frm().Top() > pMyFrm->Frm().Top() ) @@ -1021,7 +1021,7 @@ SwCntntNode::~SwCntntNode() ((SwAttrSet*)mpAttrSet.get())->SetModifyAtAttr( 0 ); } -void SwCntntNode::Modify( SfxPoolItem* pOldValue, SfxPoolItem* pNewValue ) +void SwCntntNode::Modify( const SfxPoolItem* pOldValue, const SfxPoolItem* pNewValue ) { sal_uInt16 nWhich = pOldValue ? pOldValue->Which() : pNewValue ? pNewValue->Which() : 0 ; @@ -1033,7 +1033,7 @@ void SwCntntNode::Modify( SfxPoolItem* pOldValue, SfxPoolItem* pNewValue ) SwFmt * pFmt = (SwFmt *) ((SwPtrMsgPoolItem *)pNewValue)->pObject; // nicht umhaengen wenn dieses das oberste Format ist !! - if( pRegisteredIn == pFmt ) + if( GetRegisteredIn() == pFmt ) { if( pFmt->GetRegisteredIn() ) { @@ -1100,7 +1100,7 @@ void SwCntntNode::Modify( SfxPoolItem* pOldValue, SfxPoolItem* pNewValue ) break; } - SwModify::Modify( pOldValue, pNewValue ); + NotifyClients( pOldValue, pNewValue ); } sal_Bool SwCntntNode::InvalidateNumRule() @@ -1118,12 +1118,10 @@ sal_Bool SwCntntNode::InvalidateNumRule() return 0 != pRule; } - -SwCntntFrm *SwCntntNode::GetFrm( const Point* pPoint, - const SwPosition *pPos, - const sal_Bool bCalcFrm ) const +SwCntntFrm *SwCntntNode::getLayoutFrm( const SwRootFrm* _pRoot, + const Point* pPoint, const SwPosition *pPos, const sal_Bool bCalcFrm ) const { - return (SwCntntFrm*) ::GetFrmOfModify( *(SwModify*)this, FRM_CNTNT, + return (SwCntntFrm*) ::GetFrmOfModify( _pRoot, *(SwModify*)this, FRM_CNTNT, pPoint, pPos, bCalcFrm ); } @@ -1131,7 +1129,7 @@ SwRect SwCntntNode::FindLayoutRect( const sal_Bool bPrtArea, const Point* pPoint const sal_Bool bCalcFrm ) const { SwRect aRet; - SwCntntFrm* pFrm = (SwCntntFrm*)::GetFrmOfModify( *(SwModify*)this, + SwCntntFrm* pFrm = (SwCntntFrm*)::GetFrmOfModify( 0, *(SwModify*)this, FRM_CNTNT, pPoint, 0, bCalcFrm ); if( pFrm ) aRet = bPrtArea ? pFrm->Prt() : pFrm->Frm(); @@ -1142,7 +1140,7 @@ SwRect SwCntntNode::FindPageFrmRect( const sal_Bool bPrtArea, const Point* pPoin const sal_Bool bCalcFrm ) const { SwRect aRet; - SwFrm* pFrm = ::GetFrmOfModify( *(SwModify*)this, + SwFrm* pFrm = ::GetFrmOfModify( 0, *(SwModify*)this, FRM_CNTNT, pPoint, 0, bCalcFrm ); if( pFrm && 0 != ( pFrm = pFrm->FindPageFrm() )) aRet = bPrtArea ? pFrm->Prt() : pFrm->Frm(); @@ -1180,8 +1178,6 @@ SwFmtColl *SwCntntNode::ChgFmtColl( SwFmtColl *pNewColl ) { SwFmtChg aTmp1( pOldColl ); SwFmtChg aTmp2( pNewColl ); - // damit alles was im Modify passiert hier nicht noch impl. - // werden muss SwCntntNode::Modify( &aTmp1, &aTmp2 ); } } @@ -1314,7 +1310,7 @@ void SwCntntNode::MakeFrms( SwCntntNode& rNode ) while( 0 != (pUpper = aNode2Layout.UpperFrm( pFrm, rNode )) ) { - pNew = rNode.MakeFrm(); + pNew = rNode.MakeFrm( pUpper ); pNew->Paste( pUpper, pFrm ); // #i27138# // notify accessibility paragraphs objects about changed @@ -1323,7 +1319,7 @@ void SwCntntNode::MakeFrms( SwCntntNode& rNode ) // and relation CONTENT_FLOWS_TO for previous paragraph will change. if ( pNew->IsTxtFrm() ) { - ViewShell* pViewShell( pNew->GetShell() ); + ViewShell* pViewShell( pNew->getRootFrm()->GetCurrShell() ); if ( pViewShell && pViewShell->GetLayout() && pViewShell->GetLayout()->IsAnyShellAccessible() ) { @@ -1348,60 +1344,7 @@ void SwCntntNode::DelFrms() if( !GetDepends() ) return; - SwClientIter aIter( *this ); - SwCntntFrm *pFrm; - - for( pFrm = (SwCntntFrm*)aIter.First( TYPE(SwCntntFrm)); pFrm; - pFrm = (SwCntntFrm*)aIter.Next() ) - { - // #i27138# - // notify accessibility paragraphs objects about changed - // CONTENT_FLOWS_FROM/_TO relation. - // Relation CONTENT_FLOWS_FROM for current next paragraph will change - // and relation CONTENT_FLOWS_TO for current previous paragraph will change. - if ( pFrm->IsTxtFrm() ) - { - ViewShell* pViewShell( pFrm->GetShell() ); - if ( pViewShell && pViewShell->GetLayout() && - pViewShell->GetLayout()->IsAnyShellAccessible() ) - { - pViewShell->InvalidateAccessibleParaFlowRelation( - dynamic_cast<SwTxtFrm*>(pFrm->FindNextCnt( true )), - dynamic_cast<SwTxtFrm*>(pFrm->FindPrevCnt( true )) ); - } - } - // <-- - if( pFrm->HasFollow() ) - pFrm->GetFollow()->_SetIsFollow( pFrm->IsFollow() ); - if( pFrm->IsFollow() ) - { - SwCntntFrm* pMaster = (SwTxtFrm*)pFrm->FindMaster(); - pMaster->SetFollow( pFrm->GetFollow() ); - pFrm->_SetIsFollow( sal_False ); - } - pFrm->SetFollow( 0 );//Damit er nicht auf dumme Gedanken kommt. - //Andernfalls kann es sein, dass ein Follow - //vor seinem Master zerstoert wird, der Master - //greift dann ueber den ungueltigen - //Follow-Pointer auf fremdes Memory zu. - //Die Kette darf hier zerknauscht werden, weil - //sowieso alle zerstoert werden. - if( pFrm->GetUpper() && pFrm->IsInFtn() && !pFrm->GetIndNext() && - !pFrm->GetIndPrev() ) - { - SwFtnFrm *pFtn = pFrm->FindFtnFrm(); - OSL_ENSURE( pFtn, "You promised a FtnFrm?" ); - SwCntntFrm* pCFrm; - if( !pFtn->GetFollow() && !pFtn->GetMaster() && - 0 != ( pCFrm = pFtn->GetRefFromAttr()) && pCFrm->IsFollow() ) - { - OSL_ENSURE( pCFrm->IsTxtFrm(), "NoTxtFrm has Footnote?" ); - ((SwTxtFrm*)pCFrm->FindMaster())->Prepare( PREP_FTN_GONE ); - } - } - pFrm->Cut(); - delete pFrm; - } + SwCntntFrm::DelFrms(*this); if( IsTxtNode() ) { ((SwTxtNode*)this)->SetWrong( NULL ); @@ -1453,7 +1396,7 @@ sal_Bool SwCntntNode::GetInfo( SfxPoolItem& rInfo ) const case RES_CONTENT_VISIBLE: { ((SwPtrMsgPoolItem&)rInfo).pObject = - SwClientIter( *(SwCntntNode*)this ).First( TYPE(SwFrm) ); + SwIterator<SwFrm,SwCntntNode>::FirstElement(*this); } return sal_False; } @@ -1491,7 +1434,7 @@ sal_Bool SwCntntNode::SetAttr(const SfxPoolItem& rAttr ) { SwAttrSetChg aChgOld( *GetpSwAttrSet(), aOld ); SwAttrSetChg aChgNew( *GetpSwAttrSet(), aNew ); - Modify( &aChgOld, &aChgNew ); // alle veraenderten werden verschickt + ModifyNotification( &aChgOld, &aChgNew ); // alle veraenderten werden verschickt } } return bRet; @@ -1567,7 +1510,7 @@ sal_Bool SwCntntNode::SetAttr( const SfxItemSet& rSet ) // einige Sonderbehandlungen fuer Attribute SwAttrSetChg aChgOld( *GetpSwAttrSet(), aOld ); SwAttrSetChg aChgNew( *GetpSwAttrSet(), aNew ); - Modify( &aChgOld, &aChgNew ); // alle veraenderten werden verschickt + ModifyNotification( &aChgOld, &aChgNew ); // alle veraenderten werden verschickt } } return bRet; @@ -1617,7 +1560,7 @@ sal_Bool SwCntntNode::ResetAttr( sal_uInt16 nWhich1, sal_uInt16 nWhich2 ) { SwAttrSetChg aChgOld( *GetpSwAttrSet(), aOld ); SwAttrSetChg aChgNew( *GetpSwAttrSet(), aNew ); - Modify( &aChgOld, &aChgNew ); // alle veraenderten werden verschickt + ModifyNotification( &aChgOld, &aChgNew ); // alle veraenderten werden verschickt if( !GetpSwAttrSet()->Count() ) // leer, dann loeschen mpAttrSet.reset();//DELETEZ( mpAttrSet ); @@ -1658,7 +1601,7 @@ sal_Bool SwCntntNode::ResetAttr( const SvUShorts& rWhichArr ) { SwAttrSetChg aChgOld( *GetpSwAttrSet(), aOld ); SwAttrSetChg aChgNew( *GetpSwAttrSet(), aNew ); - Modify( &aChgOld, &aChgNew ); // alle veraenderten werden verschickt + ModifyNotification( &aChgOld, &aChgNew ); // alle veraenderten werden verschickt } } if( !GetpSwAttrSet()->Count() ) // leer, dann loeschen @@ -1697,7 +1640,7 @@ sal_uInt16 SwCntntNode::ResetAllAttr() { SwAttrSetChg aChgOld( *GetpSwAttrSet(), aOld ); SwAttrSetChg aChgNew( *GetpSwAttrSet(), aNew ); - Modify( &aChgOld, &aChgNew ); // alle veraenderten werden verschickt + ModifyNotification( &aChgOld, &aChgNew ); // alle veraenderten werden verschickt if( !GetpSwAttrSet()->Count() ) // leer, dann loeschen mpAttrSet.reset();//DELETEZ( mpAttrSet ); @@ -1837,7 +1780,7 @@ void SwCntntNode::SetCondFmtColl( SwFmtColl* pColl ) { SwFmtChg aTmp1( pOldColl ? pOldColl : GetFmtColl() ); SwFmtChg aTmp2( pColl ? pColl : GetFmtColl() ); - SwModify::Modify( &aTmp1, &aTmp2 ); + NotifyClients( &aTmp1, &aTmp2 ); } if( IsInCache() ) { @@ -1990,7 +1933,7 @@ short SwCntntNode::GetTextDirection( const SwPosition& rPos, aPt = *pPt; // #i72024# - No format of the frame, because this can cause recursive layout actions - SwFrm* pFrm = GetFrm( &aPt, &rPos, sal_False ); + SwFrm* pFrm = getLayoutFrm( GetDoc()->GetCurrentLayout(), &aPt, &rPos, sal_False ); if ( pFrm ) { @@ -2015,6 +1958,24 @@ short SwCntntNode::GetTextDirection( const SwPosition& rPos, } // <-- +SwOLENodes* SwCntntNode::CreateOLENodesArray( const SwFmtColl& rColl, bool bOnlyWithInvalidSize ) +{ + SwOLENodes *pNodes = 0; + SwIterator<SwCntntNode,SwFmtColl> aIter( rColl ); + for( SwCntntNode* pNd = aIter.First(); pNd; pNd = aIter.Next() ) + { + SwOLENode *pONd = pNd->GetOLENode(); + if ( pONd && (!bOnlyWithInvalidSize || pONd->IsOLESizeInvalid()) ) + { + if ( !pNodes ) + pNodes = new SwOLENodes; + pNodes->Insert( pONd, pNodes->Count() ); + } + } + + return pNodes; +} + //FEATURE::CONDCOLL // Metoden aus Node.hxx - erst hier ist der TxtNode bekannt !! // os: nur fuer ICC, da der zum optimieren zu dumm ist diff --git a/sw/source/core/docnode/node2lay.cxx b/sw/source/core/docnode/node2lay.cxx index 88169f482382..16bc2fef53ae 100644 --- a/sw/source/core/docnode/node2lay.cxx +++ b/sw/source/core/docnode/node2lay.cxx @@ -29,8 +29,8 @@ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_sw.hxx" - -#include <calbck.hxx> // SwClientIter +#include <switerator.hxx> +#include <calbck.hxx> #include <node.hxx> #include <ndindex.hxx> #include <swtable.hxx> @@ -43,14 +43,14 @@ #include "section.hxx" #include "node2lay.hxx" - /* -------------------------------------------------- * Die SwNode2LayImpl-Klasse erledigt die eigentliche Arbeit, * die SwNode2Layout-Klasse ist nur die der Oefffentlichkeit bekannte Schnittstelle * --------------------------------------------------*/ class SwNode2LayImpl { - SwClientIter *pIter; // Der eigentliche Iterator + SwIterator<SwFrm,SwModify>* pIter; + SwModify* pMod; SvPtrarr *pUpperFrms;// Zum Einsammeln der Upper sal_uLong nIndex; // Der Index des einzufuegenden Nodes sal_Bool bMaster : 1; // sal_True => nur Master , sal_False => nur Frames ohne Follow @@ -78,6 +78,71 @@ public: * vor oder hinter den eingefuegt werden soll. * --------------------------------------------------*/ +SwNode* GoNextWithFrm(const SwNodes& rNodes, SwNodeIndex *pIdx) +{ + if( pIdx->GetIndex() >= rNodes.Count() - 1 ) + return 0; + + SwNodeIndex aTmp(*pIdx, +1); + SwNode* pNd = 0; + while( aTmp < rNodes.Count()-1 ) + { + pNd = &aTmp.GetNode(); + bool bFound = false; + if ( pNd->IsCntntNode() ) + bFound = ( SwIterator<SwFrm,SwCntntNode>::FirstElement(*(SwCntntNode*)pNd) != 0); + else if ( pNd->IsTableNode() ) + bFound = ( SwIterator<SwFrm,SwFmt>::FirstElement(*((SwTableNode*)pNd)->GetTable().GetFrmFmt()) != 0 ); + else if( pNd->IsEndNode() && !pNd->StartOfSectionNode()->IsSectionNode() ) + { + pNd = 0; + break; + } + if ( bFound ) + break; + aTmp++; + } + + if( aTmp == rNodes.Count()-1 ) + pNd = 0; + else if( pNd ) + (*pIdx) = aTmp; + return pNd; +} + +SwNode* GoPreviousWithFrm(SwNodeIndex *pIdx) +{ + if( !pIdx->GetIndex() ) + return 0; + + SwNodeIndex aTmp( *pIdx, -1 ); + SwNode* pNd(0); + while( aTmp.GetIndex() ) + { + pNd = &aTmp.GetNode(); + bool bFound = false; + if ( pNd->IsCntntNode() ) + bFound = ( SwIterator<SwFrm,SwCntntNode>::FirstElement(*(SwCntntNode*)pNd) != 0); + else if ( pNd->IsTableNode() ) + bFound = ( SwIterator<SwFrm,SwFmt>::FirstElement(*((SwTableNode*)pNd)->GetTable().GetFrmFmt()) != 0 ); + else if( pNd->IsStartNode() && !pNd->IsSectionNode() ) + { + pNd = 0; + break; + } + if ( bFound ) + break; + aTmp--; + } + + if( !aTmp.GetIndex() ) + pNd = 0; + else if( pNd ) + (*pIdx) = aTmp; + return pNd; +} + + SwNode2LayImpl::SwNode2LayImpl( const SwNode& rNode, sal_uLong nIdx, sal_Bool bSearch ) : pUpperFrms( NULL ), nIndex( nIdx ), bInit( sal_False ) { @@ -89,7 +154,7 @@ SwNode2LayImpl::SwNode2LayImpl( const SwNode& rNode, sal_uLong nIdx, sal_Bool bS if( !bSearch && rNode.GetIndex() < nIndex ) { SwNodeIndex aTmp( *rNode.EndOfSectionNode(), +1 ); - pNd = rNode.GetNodes().GoPreviousWithFrm( &aTmp ); + pNd = GoPreviousWithFrm( &aTmp ); if( !bSearch && pNd && rNode.GetIndex() > pNd->GetIndex() ) pNd = NULL; // Nicht ueber den Bereich hinausschiessen bMaster = sal_False; @@ -97,7 +162,7 @@ SwNode2LayImpl::SwNode2LayImpl( const SwNode& rNode, sal_uLong nIdx, sal_Bool bS else { SwNodeIndex aTmp( rNode, -1 ); - pNd = rNode.GetNodes().GoNextWithFrm( &aTmp ); + pNd = GoNextWithFrm( rNode.GetNodes(), &aTmp ); bMaster = sal_True; if( !bSearch && pNd && rNode.EndOfSectionIndex() < pNd->GetIndex() ) pNd = NULL; // Nicht ueber den Bereich hinausschiessen @@ -110,7 +175,6 @@ SwNode2LayImpl::SwNode2LayImpl( const SwNode& rNode, sal_uLong nIdx, sal_Bool bS } if( pNd ) { - SwModify *pMod; if( pNd->IsCntntNode() ) pMod = (SwModify*)pNd->GetCntntNode(); else @@ -118,10 +182,13 @@ SwNode2LayImpl::SwNode2LayImpl( const SwNode& rNode, sal_uLong nIdx, sal_Bool bS OSL_ENSURE( pNd->IsTableNode(), "For Tablenodes only" ); pMod = pNd->GetTableNode()->GetTable().GetFrmFmt(); } - pIter = new SwClientIter( *pMod ); + pIter = new SwIterator<SwFrm,SwModify>( *pMod ); } else + { pIter = NULL; + pMod = 0; + } } /* -------------------------------------------------- @@ -142,11 +209,11 @@ SwFrm* SwNode2LayImpl::NextFrm() return sal_False; if( !bInit ) { - pRet = (SwFrm*)pIter->First(TYPE(SwFrm)); + pRet = pIter->First(); bInit = sal_True; } else - pRet = (SwFrm*)pIter->Next(); + pRet = pIter->Next(); while( pRet ) { SwFlowFrm* pFlow = SwFlowFrm::CastFlowFrm( pRet ); @@ -189,7 +256,7 @@ SwFrm* SwNode2LayImpl::NextFrm() } return pRet; } - pRet = (SwFrm*)pIter->Next(); + pRet = pIter->Next(); } return NULL; } @@ -216,6 +283,7 @@ void SwNode2LayImpl::SaveUpperFrms() } delete pIter; pIter = NULL; + pMod = 0; } SwLayoutFrm* SwNode2LayImpl::UpperFrm( SwFrm* &rpFrm, const SwNode &rNode ) @@ -256,7 +324,7 @@ SwLayoutFrm* SwNode2LayImpl::UpperFrm( SwFrm* &rpFrm, const SwNode &rNode ) return static_cast<SwLayoutFrm*>(pFrm); } - pUpper = new SwSectionFrm(((SwSectionNode*)pNode)->GetSection()); + pUpper = new SwSectionFrm(((SwSectionNode*)pNode)->GetSection(), rpFrm); pUpper->Paste( rpFrm->GetUpper(), bMaster ? rpFrm : rpFrm->GetNext() ); static_cast<SwSectionFrm*>(pUpper)->Init(); @@ -300,7 +368,7 @@ void SwNode2LayImpl::RestoreUpperFrms( SwNodes& rNds, sal_uLong nStt, sal_uLong pNxt = pNxt->GetNext(); else pNxt = pUp->Lower(); - pNew = ((SwCntntNode*)pNd)->MakeFrm(); + pNew = ((SwCntntNode*)pNd)->MakeFrm( pUp ); pNew->Paste( pUp, pNxt ); (*pUpperFrms)[n-2] = pNew; } @@ -315,7 +383,7 @@ void SwNode2LayImpl::RestoreUpperFrms( SwNodes& rNds, sal_uLong nStt, sal_uLong pNxt = pNxt->GetNext(); else pNxt = pUp->Lower(); - pNew = ((SwTableNode*)pNd)->MakeFrm(); + pNew = ((SwTableNode*)pNd)->MakeFrm( pUp ); OSL_ENSURE( pNew->IsTabFrm(), "Table exspected" ); pNew->Paste( pUp, pNxt ); ((SwTabFrm*)pNew)->RegistFlys(); @@ -359,9 +427,8 @@ SwFrm* SwNode2LayImpl::GetFrm( const Point* pDocPos, const SwPosition *pPos, const sal_Bool bCalcFrm ) const { - return pIter ? ::GetFrmOfModify( pIter->GetModify(), USHRT_MAX, - pDocPos, pPos, bCalcFrm ) - : 0; + // mba: test if change of member pIter -> pMod broke anything + return pMod ? ::GetFrmOfModify( 0, *pMod, USHRT_MAX, pDocPos, pPos, bCalcFrm ) : 0; } SwNode2Layout::SwNode2Layout( const SwNode& rNd, sal_uLong nIdx ) diff --git a/sw/source/core/docnode/nodes.cxx b/sw/source/core/docnode/nodes.cxx index 6f4640035830..dbd0f4194bf8 100644 --- a/sw/source/core/docnode/nodes.cxx +++ b/sw/source/core/docnode/nodes.cxx @@ -346,7 +346,7 @@ void SwNodes::ChgNode( SwNodeIndex& rDelPos, sal_uLong nSz, SwPtrMsgPoolItem aMsgHint( nDelMsg, (void*)&pAttr->GetAttr() ); rNds.GetDoc()->GetUnoCallBack()-> - Modify( &aMsgHint, &aMsgHint ); + ModifyNotification( &aMsgHint, &aMsgHint ); } } } @@ -375,7 +375,7 @@ void SwNodes::ChgNode( SwNodeIndex& rDelPos, sal_uLong nSz, if( bNewFrms ) bNewFrms = &GetDoc()->GetNodes() == (const SwNodes*)&rNds && - GetDoc()->GetRootFrm(); + GetDoc()->GetCurrentViewShell(); //swmod 071108//swmod 071225 if( bNewFrms ) { // Frames besorgen: @@ -623,7 +623,7 @@ sal_Bool SwNodes::_MoveNodes( const SwNodeRange& aRange, SwNodes & rNodes, SwFrmFmt* pTblFmt = pTblNd->GetTable().GetFrmFmt(); SwPtrMsgPoolItem aMsgHint( RES_REMOVE_UNO_OBJECT, pTblFmt ); - pTblFmt->Modify( &aMsgHint, &aMsgHint ); + pTblFmt->ModifyNotification( &aMsgHint, &aMsgHint ); } } if( bNewFrms ) @@ -1438,79 +1438,6 @@ SwCntntNode* SwNodes::GoPrevious(SwNodeIndex *pIdx) const return (SwCntntNode*)pNd; } -SwNode* SwNodes::GoNextWithFrm(SwNodeIndex *pIdx) const -{ - if( pIdx->GetIndex() >= Count() - 1 ) - return 0; - - SwNodeIndex aTmp(*pIdx, +1); - SwNode* pNd = 0; - while( aTmp < Count()-1 ) - { - pNd = &aTmp.GetNode(); - SwModify *pMod = 0; - if ( pNd->IsCntntNode() ) - pMod = (SwCntntNode*)pNd; - else if ( pNd->IsTableNode() ) - pMod = ((SwTableNode*)pNd)->GetTable().GetFrmFmt(); - else if( pNd->IsEndNode() && !pNd->StartOfSectionNode()->IsSectionNode() ) - { - pNd = 0; - break; - } - if ( pMod && pMod->GetDepends() ) - { - SwClientIter aIter( *pMod ); - if( aIter.First( TYPE(SwFrm) ) ) - break; - } - aTmp++; - } - if( aTmp == Count()-1 ) - pNd = 0; - else if( pNd ) - (*pIdx) = aTmp; - return pNd; -} - -SwNode* SwNodes::GoPreviousWithFrm(SwNodeIndex *pIdx) const -{ - if( !pIdx->GetIndex() ) - return 0; - - SwNodeIndex aTmp( *pIdx, -1 ); - SwNode* pNd(0); - while( aTmp.GetIndex() ) - { - pNd = &aTmp.GetNode(); - SwModify *pMod = 0; - if ( pNd->IsCntntNode() ) - pMod = (SwCntntNode*)pNd; - else if ( pNd->IsTableNode() ) - pMod = ((SwTableNode*)pNd)->GetTable().GetFrmFmt(); - else if( pNd->IsStartNode() && !pNd->IsSectionNode() ) - { - pNd = 0; - break; - } - if ( pMod && pMod->GetDepends() ) - { - SwClientIter aIter( *pMod ); - if( aIter.First( TYPE(SwFrm) ) ) - break; - } - aTmp--; - } - - if( !aTmp.GetIndex() ) - pNd = 0; - else if( pNd ) - (*pIdx) = aTmp; - return pNd; -} - - - /************************************************************************* |* |* sal_Bool SwNodes::CheckNodesRange() @@ -2295,7 +2222,7 @@ SwNode* SwNodes::FindPrvNxtFrmNode( SwNodeIndex& rFrmIdx, SwNode* pFrmNd = 0; // habe wir gar kein Layout, vergiss es - if( GetDoc()->GetRootFrm() ) + if( GetDoc()->GetCurrentViewShell() ) //swmod 071108//swmod 071225 { SwNode* pSttNd = &rFrmIdx.GetNode(); diff --git a/sw/source/core/docnode/section.cxx b/sw/source/core/docnode/section.cxx index af76b42d4150..a5bcf822af03 100644 --- a/sw/source/core/docnode/section.cxx +++ b/sw/source/core/docnode/section.cxx @@ -30,7 +30,6 @@ #include "precompiled_sw.hxx" #include <stdlib.h> - #include <hintids.hxx> #include <svl/intitem.hxx> #include <svl/stritem.hxx> @@ -39,7 +38,6 @@ #include <editeng/protitem.hxx> #include <sfx2/linkmgr.hxx> #include <tools/urlobj.hxx> - #include <sfx2/sfxsids.hrc> #include <sfx2/fcontnr.hxx> #include <docary.hxx> @@ -65,9 +63,11 @@ #include <fmtftntx.hxx> #include <ftnidx.hxx> #include <doctxm.hxx> -#include <fmteiro.hxx> // edit in readonly sections +#include <fmteiro.hxx> #include <swerror.h> #include <unosection.hxx> +#include <switerator.hxx> +#include <svl/smplhint.hxx> using namespace ::com::sun::star; @@ -239,7 +239,7 @@ SwSection::~SwSection() // dann melden wir noch schnell unser Format um ans dflt FrameFmt, // damit es keine Abhaengigkeiten gibt if( pFmt->DerivedFrom() != pDoc->GetDfltFrmFmt() ) - pDoc->GetDfltFrmFmt()->Add( pFmt ); + pFmt->RegisterToFormat( *pDoc->GetDfltFrmFmt() ); } else { @@ -258,7 +258,7 @@ SwSection::~SwSection() // ist die Section der letzte Client im Format, kann dieses // geloescht werden SwPtrMsgPoolItem aMsgHint( RES_REMOVE_UNO_OBJECT, pFmt ); - pFmt->Modify( &aMsgHint, &aMsgHint ); + pFmt->ModifyNotification( &aMsgHint, &aMsgHint ); if( !pFmt->GetDepends() ) { // Bug: 28191 - nicht ins Undo aufnehmen, sollte schon vorher @@ -321,7 +321,7 @@ void SwSection::ImplSetHiddenFlag(bool const bTmpHidden, bool const bCondition) // erstmal allen Childs sagen, das sie versteckt sind SwMsgPoolItem aMsgItem( RES_SECTION_HIDDEN ); - pFmt->Modify( &aMsgItem, &aMsgItem ); + pFmt->ModifyNotification( &aMsgItem, &aMsgItem ); // alle Frames loeschen pFmt->DelFrms(); @@ -338,7 +338,7 @@ void SwSection::ImplSetHiddenFlag(bool const bTmpHidden, bool const bCondition) // erstmal allen Childs sagen, das der Parent nicht mehr // versteckt ist SwMsgPoolItem aMsgItem( RES_SECTION_NOT_HIDDEN ); - pFmt->Modify( &aMsgItem, &aMsgItem ); + pFmt->ModifyNotification( &aMsgItem, &aMsgItem ); pFmt->MakeFrms(); } @@ -421,7 +421,7 @@ void SwSection::SetEditInReadonly(bool const bFlag) } } -void SwSection::Modify( SfxPoolItem* pOld, SfxPoolItem* pNew ) +void SwSection::Modify( const SfxPoolItem* pOld, const SfxPoolItem* pNew ) { bool bRemake = false; bool bUpdateFtn = false; @@ -470,7 +470,7 @@ void SwSection::Modify( SfxPoolItem* pOld, SfxPoolItem* pNew ) if( pNew ) { bool bNewFlag = - static_cast<SvxProtectItem*>(pNew)->IsCntntProtected(); + static_cast<const SvxProtectItem*>(pNew)->IsCntntProtected(); if( !bNewFlag ) { // Abschalten: teste ob nicht vielleich ueber die Parents @@ -494,7 +494,7 @@ void SwSection::Modify( SfxPoolItem* pOld, SfxPoolItem* pNew ) if( pNew ) { const bool bNewFlag = - static_cast<SwFmtEditInReadonly*>(pNew)->GetValue(); + static_cast<const SwFmtEditInReadonly*>(pNew)->GetValue(); m_Data.SetEditInReadonlyFlag( bNewFlag ); } return; @@ -525,6 +525,10 @@ void SwSection::Modify( SfxPoolItem* pOld, SfxPoolItem* pNew ) bUpdateFtn = true; } break; + + default: + CheckRegistration( pOld, pNew ); + break; } if( bRemake ) @@ -539,7 +543,6 @@ void SwSection::Modify( SfxPoolItem* pOld, SfxPoolItem* pNew ) if( pSectNd ) pSectNd->GetDoc()->GetFtnIdxs().UpdateFtn(SwNodeIndex( *pSectNd )); } - SwClient::Modify( pOld, pNew ); } void SwSection::SetRefObject( SwServerObject* pObj ) @@ -682,19 +685,9 @@ SwSectionFmt::~SwSectionFmt() rSect.SetHidden(false); } } - SwClientIter aIter( *this ); - SwClient *pLast = aIter.GoStart(); - while ( pLast ) - { - if ( pLast->IsA( TYPE(SwFrm) ) ) - { - SwSectionFrm *pFrm = (SwSectionFrm*)pLast; - SwSectionFrm::MoveCntntAndDelete( pFrm, sal_True ); - pLast = aIter.GoStart(); - } - else - pLast = aIter++; - } + // mba: test iteration; objects are removed while iterating + CallSwClientNotify( SfxSimpleHint(SFX_HINT_DYING) ); + // hebe die Section doch mal auf SwNodeRange aRg( *pSectNd, 0, *pSectNd->EndOfSectionNode() ); GetDoc()->GetNodes().SectionUp( &aRg ); @@ -708,14 +701,7 @@ SwSectionFmt::~SwSectionFmt() SwSection * SwSectionFmt::GetSection() const { - if( GetDepends() ) - { - SwClientIter aIter( *(SwSectionFmt*)this ); - return (SwSectionPtr)aIter.First( TYPE(SwSection) ); - } - - OSL_FAIL( "keine Section als Client." ); - return 0; + return SwIterator<SwSection,SwSectionFmt>::FirstElement( *this ); } extern void lcl_DeleteFtn( SwSectionNode *pNd, sal_uLong nStt, sal_uLong nEnd ); @@ -728,31 +714,17 @@ void SwSectionFmt::DelFrms() if( pIdx && &GetDoc()->GetNodes() == &pIdx->GetNodes() && 0 != (pSectNd = pIdx->GetNode().GetSectionNode() )) { - SwClientIter aIter( *this ); - SwClient *pLast = aIter.GoStart(); - // First delete the <SwSectionFrm> of the <SwSectionFmt> instance - while ( pLast ) - { - if ( pLast->IsA( TYPE(SwFrm) ) ) - { - SwSectionFrm *pFrm = (SwSectionFrm*)pLast; - SwSectionFrm::MoveCntntAndDelete( pFrm, sal_False ); - pLast = aIter.GoStart(); - } - else - { - pLast = aIter++; - } - } + // #147431# : First delete the <SwSectionFrm> of the <SwSectionFmt> instance + // mba: test iteration as objects are removed in iteration + CallSwClientNotify( SfxSimpleHint(SFX_HINT_DYING) ); + // Then delete frames of the nested <SwSectionFmt> instances - pLast = aIter.GoStart(); + SwIterator<SwSectionFmt,SwSectionFmt> aIter( *this ); + SwSectionFmt *pLast = aIter.First(); while ( pLast ) { - if ( pLast->IsA( TYPE(SwSectionFmt) ) ) - { - ((SwSectionFmt*)pLast)->DelFrms(); - } - pLast = aIter++; + pLast->DelFrms(); + pLast = aIter.Next(); } sal_uLong nEnde = pSectNd->EndOfSectionIndex(); @@ -770,7 +742,7 @@ void SwSectionFmt::DelFrms() if( pCNd ) { const SfxPoolItem& rItem = pCNd->GetSwAttrSet().Get( RES_PAGEDESC ); - pCNd->Modify( (SfxPoolItem*)&rItem, (SfxPoolItem*)&rItem ); + pCNd->ModifyNotification( (SfxPoolItem*)&rItem, (SfxPoolItem*)&rItem ); } } } @@ -790,18 +762,7 @@ void SwSectionFmt::MakeFrms() } } -void lcl_ClientIter( SwSectionFmt* pFmt, const SfxPoolItem* pOld, - const SfxPoolItem* pNew ) -{ - SwClientIter aIter( *pFmt ); - SwClient * pLast = aIter.GoStart(); - if( pLast ) - do { - pLast->Modify( (SfxPoolItem*)pOld, (SfxPoolItem*)pNew ); - } while( 0 != ( pLast = aIter++ )); -} - -void SwSectionFmt::Modify( SfxPoolItem* pOld, SfxPoolItem* pNew ) +void SwSectionFmt::Modify( const SfxPoolItem* pOld, const SfxPoolItem* pNew ) { sal_Bool bClients = sal_False; sal_uInt16 nWhich = pOld ? pOld->Which() : pNew ? pNew->Which() : 0; @@ -816,7 +777,7 @@ void SwSectionFmt::Modify( SfxPoolItem* pOld, SfxPoolItem* pNew ) if( SFX_ITEM_SET == pNewSet->GetItemState( RES_PROTECT, sal_False, &pItem )) { - lcl_ClientIter( this, pItem, pItem ); + ModifyBroadcast( (SfxPoolItem*)pItem, (SfxPoolItem*)pItem ); pNewSet->ClearItem( RES_PROTECT ); pOldSet->ClearItem( RES_PROTECT ); } @@ -825,7 +786,7 @@ void SwSectionFmt::Modify( SfxPoolItem* pOld, SfxPoolItem* pNew ) if( SFX_ITEM_SET == pNewSet->GetItemState( RES_EDIT_IN_READONLY, sal_False, &pItem ) ) { - lcl_ClientIter( this, pItem, pItem ); + ModifyBroadcast( (SfxPoolItem*)pItem, (SfxPoolItem*)pItem ); pNewSet->ClearItem( RES_EDIT_IN_READONLY ); pOldSet->ClearItem( RES_EDIT_IN_READONLY ); } @@ -834,16 +795,14 @@ void SwSectionFmt::Modify( SfxPoolItem* pOld, SfxPoolItem* pNew ) if( SFX_ITEM_SET == pNewSet->GetItemState( RES_FTN_AT_TXTEND, sal_False, &pItem )) { - lcl_ClientIter( this, &pOldSet->Get( RES_FTN_AT_TXTEND ), - pItem ); + ModifyBroadcast( (SfxPoolItem*)&pOldSet->Get( RES_FTN_AT_TXTEND ), (SfxPoolItem*)pItem ); pNewSet->ClearItem( RES_FTN_AT_TXTEND ); pOldSet->ClearItem( RES_FTN_AT_TXTEND ); } if( SFX_ITEM_SET == pNewSet->GetItemState( RES_END_AT_TXTEND, sal_False, &pItem )) { - lcl_ClientIter( this, &pOldSet->Get( RES_END_AT_TXTEND ), - pItem ); + ModifyBroadcast( (SfxPoolItem*)&pOldSet->Get( RES_END_AT_TXTEND ), (SfxPoolItem*)pItem ); pNewSet->ClearItem( RES_END_AT_TXTEND ); pOldSet->ClearItem( RES_END_AT_TXTEND ); } @@ -863,12 +822,7 @@ void SwSectionFmt::Modify( SfxPoolItem* pOld, SfxPoolItem* pNew ) if( pSect && ( bClients || ( RES_SECTION_HIDDEN == nWhich ? !pSect->IsHiddenFlag() : pSect->IsHiddenFlag() ) ) ) { - // selbst ueber die Clients iterieren, sollte schneller sein! - SwClientIter aIter( *this ); - SwClient * pLast = aIter.GoStart(); - do { - pLast->Modify( pOld, pNew ); - } while( 0 != ( pLast = aIter++ )); + ModifyBroadcast( pOld, pNew ); } } return ; @@ -879,12 +833,7 @@ void SwSectionFmt::Modify( SfxPoolItem* pOld, SfxPoolItem* pNew ) // diese Messages bis zum Ende des Baums durchreichen ! if( GetDepends() ) { - SwClientIter aIter( *this ); - SwClient * pLast = aIter.GoStart(); - if( pLast ) // konnte zum Anfang gesprungen werden ?? - do { - pLast->Modify( pOld, pNew ); - } while( 0 != ( pLast = aIter++ )); + ModifyBroadcast( pOld, pNew ); } return; // das wars @@ -936,17 +885,16 @@ sal_Bool SwSectionFmt::GetInfo( SfxPoolItem& rInfo ) const case RES_CONTENT_VISIBLE: { - SwFrm* pFrm = (SwFrm*)SwClientIter( *(SwSectionFmt*)this ).First( TYPE(SwFrm) ); + SwFrm* pFrm = SwIterator<SwFrm,SwFmt>::FirstElement(*this); // if the current section has no own frame search for the children if(!pFrm) { - SwClientIter aFormatIter( *(SwSectionFmt*)this ); - SwSectionFmt* pChild = (SwSectionFmt*)aFormatIter. - First( TYPE(SwSectionFmt) ); + SwIterator<SwSectionFmt,SwSectionFmt> aFormatIter(*this); + SwSectionFmt* pChild = aFormatIter.First(); while(pChild && !pFrm) { - pFrm = (SwFrm*)SwClientIter( *pChild ).First( TYPE(SwFrm) ); - pChild = (SwSectionFmt*)aFormatIter.Next(); + pFrm = SwIterator<SwFrm,SwFmt>::FirstElement(*pChild); + pChild = aFormatIter.Next(); } } ((SwPtrMsgPoolItem&)rInfo).pObject = pFrm; @@ -1005,15 +953,14 @@ sal_uInt16 SwSectionFmt::GetChildSections( SwSections& rArr, if( GetDepends() ) { - SwClientIter aIter( *this ); - SwClient * pLast; + SwIterator<SwSectionFmt,SwSectionFmt> aIter(*this); const SwNodeIndex* pIdx; - for( pLast = aIter.First(TYPE(SwSectionFmt)); pLast; pLast = aIter.Next() ) + for( SwSectionFmt* pLast = aIter.First(); pLast; pLast = aIter.Next() ) if( bAllSections || - ( 0 != ( pIdx = ((SwSectionFmt*)pLast)->GetCntnt(sal_False). + ( 0 != ( pIdx = pLast->GetCntnt(sal_False). GetCntntIdx()) && &pIdx->GetNodes() == &GetDoc()->GetNodes() )) { - const SwSection* Dummy=((SwSectionFmt*)pLast)->GetSection(); + const SwSection* Dummy = pLast->GetSection(); rArr.C40_INSERT( SwSection, Dummy, rArr.Count() ); @@ -1062,8 +1009,8 @@ void SwSectionFmt::UpdateParent() // Parent wurde veraendert const SwFmtEditInReadonly* pEditInReadonly = 0; bool bIsHidden = false; - SwClientIter aIter( *this ); - SwClient * pLast = aIter.GoStart(); + SwClientIter aIter( *this ); // TODO + ::SwClient * pLast = aIter.GoStart(); if( pLast ) // konnte zum Anfang gesprungen werden ?? do { if( pLast->IsA( TYPE(SwSectionFmt) ) ) @@ -1090,7 +1037,7 @@ void SwSectionFmt::UpdateParent() // Parent wurde veraendert if (!pProtect->IsCntntProtected() != !pSection->IsProtectFlag()) { - pLast->Modify( (SfxPoolItem*)pProtect, + pLast->ModifyNotification( (SfxPoolItem*)pProtect, (SfxPoolItem*)pProtect ); } @@ -1098,7 +1045,7 @@ void SwSectionFmt::UpdateParent() // Parent wurde veraendert if (!pEditInReadonly->GetValue() != !pSection->IsEditInReadonlyFlag()) { - pLast->Modify( (SfxPoolItem*)pEditInReadonly, + pLast->ModifyNotification( (SfxPoolItem*)pEditInReadonly, (SfxPoolItem*)pEditInReadonly ); } @@ -1107,7 +1054,7 @@ void SwSectionFmt::UpdateParent() // Parent wurde veraendert SwMsgPoolItem aMsgItem( static_cast<sal_uInt16>(bIsHidden ? RES_SECTION_HIDDEN : RES_SECTION_NOT_HIDDEN ) ); - pLast->Modify( &aMsgItem, &aMsgItem ); + pLast->ModifyNotification( &aMsgItem, &aMsgItem ); } } else if( !pSection && diff --git a/sw/source/core/docnode/swbaslnk.cxx b/sw/source/core/docnode/swbaslnk.cxx index 464753c462b7..d04fd3fee03b 100644 --- a/sw/source/core/docnode/swbaslnk.cxx +++ b/sw/source/core/docnode/swbaslnk.cxx @@ -78,7 +78,7 @@ void lcl_CallModify( SwGrfNode& rGrfNd, SfxPoolItem& rItem ) // them havent't a loaded Graphic. rGrfNd.LockModify(); - SwClientIter aIter( rGrfNd ); + SwClientIter aIter( rGrfNd ); // TODO for( int n = 0; n < 2; ++n ) { SwClient * pLast = aIter.GoStart(); @@ -86,7 +86,7 @@ void lcl_CallModify( SwGrfNode& rGrfNd, SfxPoolItem& rItem ) { do { if( (0 == n) ^ ( 0 != pLast->ISA( SwCntntFrm )) ) - pLast->Modify( &rItem, &rItem ); + pLast->ModifyNotification( &rItem, &rItem ); } while( 0 != ( pLast = aIter++ )); } } @@ -215,7 +215,7 @@ void SwBaseLink::DataChanged( const String& rMimeType, if ( (!pSh || !pSh->ActionPend()) && (!pESh || !pESh->ActionPend()) ) { SwMsgPoolItem aMsgHint( RES_GRAPHIC_PIECE_ARRIVED ); - pCntntNode->Modify( &aMsgHint, &aMsgHint ); + pCntntNode->ModifyNotification( &aMsgHint, &aMsgHint ); bUpdate = sal_False; } } @@ -280,7 +280,7 @@ void SwBaseLink::DataChanged( const String& rMimeType, } else { - pCntntNode->Modify( &aMsgHint, &aMsgHint ); + pCntntNode->ModifyNotification( &aMsgHint, &aMsgHint ); } @@ -409,7 +409,6 @@ sal_Bool SwBaseLink::SwapIn( sal_Bool bWaitForData, sal_Bool bNativFormat ) if( GetObj() ) { String aMimeType( SotExchange::GetFormatMimeType( GetContentType() )); - uno::Any aValue; GetObj()->GetData( aValue, aMimeType, !IsSynchron() && bWaitForData ); @@ -437,7 +436,6 @@ sal_Bool SwBaseLink::SwapIn( sal_Bool bWaitForData, sal_Bool bNativFormat ) bRes = Update(); bSwapIn = sal_False; - return bRes; } diff --git a/sw/source/core/draw/dcontact.cxx b/sw/source/core/draw/dcontact.cxx index 7e259ed3169d..d8d030fb4fec 100644 --- a/sw/source/core/draw/dcontact.cxx +++ b/sw/source/core/draw/dcontact.cxx @@ -34,6 +34,7 @@ #include <editeng/ulspitem.hxx> #include <editeng/lrspitem.hxx> #include <svx/svdpage.hxx> +#include <svx/svditer.hxx> #include <svx/fmglob.hxx> #include <svx/svdogrp.hxx> #include <svx/svdotext.hxx> @@ -72,7 +73,7 @@ #include <drawinglayer/primitive2d/transformprimitive2d.hxx> #include <svx/sdr/contact/viewobjectcontactofsdrobj.hxx> #include <com/sun/star/text/WritingMode2.hpp> - +#include <switerator.hxx> #include <algorithm> using namespace ::com::sun::star; @@ -295,13 +296,13 @@ void SwContact::_MoveObjToLayer( const bool _bToVisible, return; } - if ( !pRegisteredIn ) + if ( !GetRegisteredIn() ) { OSL_FAIL( "SwDrawContact::_MoveObjToLayer(..) - no drawing frame format!" ); return; } - const IDocumentDrawModelAccess* pIDDMA = static_cast<SwFrmFmt*>(pRegisteredIn)->getIDocumentDrawModelAccess(); + const IDocumentDrawModelAccess* pIDDMA = static_cast<SwFrmFmt*>(GetRegisteredInNonConst())->getIDocumentDrawModelAccess(); if ( !pIDDMA ) { OSL_FAIL( "SwDrawContact::_MoveObjToLayer(..) - no writer document!" ); @@ -392,7 +393,7 @@ sal_uInt32 SwContact::GetMinOrdNum() const { sal_uInt32 nMinOrdNum( SAL_MAX_UINT32 ); - std::vector< SwAnchoredObject* > aObjs; + std::list< SwAnchoredObject* > aObjs; GetAnchoredObjs( aObjs ); while ( !aObjs.empty() ) @@ -420,7 +421,7 @@ sal_uInt32 SwContact::GetMaxOrdNum() const { sal_uInt32 nMaxOrdNum( 0L ); - std::vector< SwAnchoredObject* > aObjs; + std::list< SwAnchoredObject* > aObjs; GetAnchoredObjs( aObjs ); while ( !aObjs.empty() ) @@ -524,90 +525,11 @@ void SwFlyDrawContact::SetMaster( SdrObject* _pNewMaster ) /************************************************************************* |* -|* SwFlyDrawContact::CreateNewRef() -|* -|*************************************************************************/ - -SwVirtFlyDrawObj *SwFlyDrawContact::CreateNewRef( SwFlyFrm *pFly ) -{ - SwVirtFlyDrawObj *pDrawObj = new SwVirtFlyDrawObj( *GetMaster(), pFly ); - pDrawObj->SetModel( GetMaster()->GetModel() ); - pDrawObj->SetUserCall( this ); - - //Der Reader erzeugt die Master und setzt diese, um die Z-Order zu - //transportieren, in die Page ein. Beim erzeugen der ersten Referenz werden - //die Master aus der Liste entfernt und fuehren von da an ein - //Schattendasein. - SdrPage* pPg( 0L ); - if ( 0 != ( pPg = GetMaster()->GetPage() ) ) - { - const sal_uInt32 nOrdNum = GetMaster()->GetOrdNum(); - pPg->ReplaceObject( pDrawObj, nOrdNum ); - } - // --> OD 2004-08-16 #i27030# - insert new <SwVirtFlyDrawObj> instance - // into drawing page with correct order number - else - { - GetFmt()->getIDocumentDrawModelAccess()->GetDrawModel()->GetPage( 0 )-> - InsertObject( pDrawObj, _GetOrdNumForNewRef( pFly ) ); - } - // <-- - // --> OD 2004-12-13 #i38889# - assure, that new <SwVirtFlyDrawObj> instance - // is in a visible layer. - MoveObjToVisibleLayer( pDrawObj ); - // <-- - return pDrawObj; -} - -/** method to determine new order number for new instance of <SwVirtFlyDrawObj> - - OD 2004-08-16 #i27030# - Used in method <CreateNewRef(..)> - - @author OD -*/ -sal_uInt32 SwFlyDrawContact::_GetOrdNumForNewRef( const SwFlyFrm* _pFlyFrm ) -{ - sal_uInt32 nOrdNum( 0L ); - - // search for another Writer fly frame registered at same frame format - SwClientIter aIter( *GetFmt() ); - const SwFlyFrm* pFlyFrm( 0L ); - for ( pFlyFrm = (SwFlyFrm*)aIter.First( TYPE(SwFlyFrm) ); - pFlyFrm; - pFlyFrm = (SwFlyFrm*)aIter.Next() ) - { - if ( pFlyFrm != _pFlyFrm ) - { - break; - } - } - - if ( pFlyFrm ) - { - // another Writer fly frame found. Take its order number - nOrdNum = pFlyFrm->GetVirtDrawObj()->GetOrdNum(); - } - else - { - // no other Writer fly frame found. Take order number of 'master' object - // --> OD 2004-11-11 #i35748# - use method <GetOrdNumDirect()> instead - // of method <GetOrdNum()> to avoid a recalculation of the order number, - // which isn't intended. - nOrdNum = GetMaster()->GetOrdNumDirect(); - // <-- - } - - return nOrdNum; -} - -/************************************************************************* -|* |* SwFlyDrawContact::Modify() |* |*************************************************************************/ -void SwFlyDrawContact::Modify( SfxPoolItem *, SfxPoolItem * ) +void SwFlyDrawContact::Modify( const SfxPoolItem*, const SfxPoolItem * ) { } @@ -687,17 +609,10 @@ void SwFlyDrawContact::MoveObjToInvisibleLayer( SdrObject* _pDrawObj ) @author */ -void SwFlyDrawContact::GetAnchoredObjs( std::vector<SwAnchoredObject*>& _roAnchoredObjs ) const +void SwFlyDrawContact::GetAnchoredObjs( std::list<SwAnchoredObject*>& _roAnchoredObjs ) const { const SwFrmFmt* pFmt = GetFmt(); - - SwClientIter aIter( *(const_cast<SwFrmFmt*>(pFmt)) ); - for( SwFlyFrm* pFlyFrm = (SwFlyFrm*)aIter.First( TYPE(SwFlyFrm) ); - pFlyFrm; - pFlyFrm = (SwFlyFrm*)aIter.Next() ) - { - _roAnchoredObjs.push_back( pFlyFrm ); - } + SwFlyFrm::GetAnchoredObjects( _roAnchoredObjs, *pFmt ); } /************************************************************************* @@ -734,7 +649,7 @@ SwDrawContact::SwDrawContact( SwFrmFmt* pToRegisterIn, SdrObject* pObj ) : // <mbUserCallActive> is sal_False. meEventTypeOfCurrentUserCall( SDRUSERCALL_MOVEONLY ) { - // clear vector containing 'virtual' drawing objects. + // clear list containing 'virtual' drawing objects. maDrawVirtObjs.clear(); // --> #i33909# - assure, that drawing object is inserted @@ -782,6 +697,45 @@ SwDrawContact::~SwDrawContact() } } +void SwDrawContact::GetTextObjectsFromFmt( std::list<SdrTextObj*>& rTextObjects, SwDoc* pDoc ) +{ + for( sal_Int32 n=0; n<pDoc->GetSpzFrmFmts()->Count(); n++ ) + { + SwFrmFmt* pFly = (*pDoc->GetSpzFrmFmts())[n]; + if( pFly->IsA( TYPE(SwDrawFrmFmt) ) ) + { + std::list<SdrTextObj*> aTextObjs; + SwDrawContact* pContact = SwIterator<SwDrawContact,SwFrmFmt>::FirstElement(*pFly); + if( pContact ) + { + SdrObject* pSdrO = pContact->GetMaster(); + if ( pSdrO ) + { + if ( pSdrO->IsA( TYPE(SdrObjGroup) ) ) + { + SdrObjListIter aListIter( *pSdrO, IM_DEEPNOGROUPS ); + //iterate inside of a grouped object + while( aListIter.IsMore() ) + { + SdrObject* pSdrOElement = aListIter.Next(); + if( pSdrOElement && pSdrOElement->IsA( TYPE(SdrTextObj) ) && + static_cast<SdrTextObj*>( pSdrOElement)->HasText() ) + { + rTextObjects.push_back((SdrTextObj*) pSdrOElement); + } + } + } + else if( pSdrO->IsA( TYPE(SdrTextObj) ) && + static_cast<SdrTextObj*>( pSdrO )->HasText() ) + { + rTextObjects.push_back((SdrTextObj*) pSdrO); + } + } + } + } + } +} + // OD 2004-03-29 #i26791# const SwAnchoredObject* SwDrawContact::GetAnchoredObj( const SdrObject* _pSdrObj ) const { @@ -1162,9 +1116,8 @@ void SwDrawContact::Changed( const SdrObject& rObj, // OD 2004-06-01 #i26791# - no event handling, if existing <ViewShell> // is in contruction SwDoc* pDoc = GetFmt()->GetDoc(); - if ( pDoc->GetRootFrm() && - pDoc->GetRootFrm()->GetCurrShell() && - pDoc->GetRootFrm()->GetCurrShell()->IsInConstructor() ) + if ( pDoc->GetCurrentViewShell() && + pDoc->GetCurrentViewShell()->IsInConstructor() ) { return; } @@ -1180,7 +1133,8 @@ void SwDrawContact::Changed( const SdrObject& rObj, //Action aufsetzen, aber nicht wenn gerade irgendwo eine Action laeuft. ViewShell *pSh = 0, *pOrg; - if ( pDoc->GetRootFrm() && pDoc->GetRootFrm()->IsCallbackActionEnabled() ) + SwRootFrm *pTmpRoot = pDoc->GetCurrentLayout();//swmod 080317 + if ( pTmpRoot && pTmpRoot->IsCallbackActionEnabled() ) { pDoc->GetEditShell( &pOrg ); pSh = pOrg; @@ -1194,13 +1148,13 @@ void SwDrawContact::Changed( const SdrObject& rObj, } while ( pSh && pSh != pOrg ); if ( pSh ) - pDoc->GetRootFrm()->StartAllAction(); + pTmpRoot->StartAllAction(); } SdrObjUserCall::Changed( rObj, eType, rOldBoundRect ); _Changed( rObj, eType, &rOldBoundRect ); //Achtung, ggf. Suizid! if ( pSh ) - pDoc->GetRootFrm()->EndAllAction(); + pTmpRoot->EndAllAction(); } // helper class for method <SwDrawContact::_Changed(..)> for handling nested @@ -1353,7 +1307,7 @@ void SwDrawContact::_Changed( const SdrObject& rObj, { if(::CheckControlLayer(maAnchoredDrawObj.DrawObj())) { - const IDocumentDrawModelAccess* pIDDMA = static_cast<SwFrmFmt*>(pRegisteredIn)->getIDocumentDrawModelAccess(); + const IDocumentDrawModelAccess* pIDDMA = static_cast<SwFrmFmt*>(GetRegisteredInNonConst())->getIDocumentDrawModelAccess(); const SdrLayerID aCurrentLayer(maAnchoredDrawObj.DrawObj()->GetLayer()); const SdrLayerID aControlLayerID(pIDDMA->GetControlsId()); const SdrLayerID aInvisibleControlLayerID(pIDDMA->GetInvisibleControlsId()); @@ -1549,7 +1503,7 @@ namespace |* |*************************************************************************/ -void SwDrawContact::Modify( SfxPoolItem *pOld, SfxPoolItem *pNew ) +void SwDrawContact::Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew ) { OSL_ENSURE( !mbDisconnectInProgress, "<SwDrawContact::Modify(..)> called during disconnection."); @@ -1754,7 +1708,7 @@ void SwDrawContact::DisconnectFromLayout( bool _bMoveMasterToInvisibleLayer ) // Instead of removing 'master' object from drawing page, move the // 'master' drawing object into the corresponding invisible layer. { - //((SwFrmFmt*)pRegisteredIn)->getIDocumentDrawModelAccess()->GetDrawModel()->GetPage(0)-> + //((SwFrmFmt*)GetRegisteredIn())->getIDocumentDrawModelAccess()->GetDrawModel()->GetPage(0)-> // RemoveObject( GetMaster()->GetOrdNum() ); // #i18447# - in order to consider group object correct // use new method <SwDrawContact::MoveObjToInvisibleLayer(..)> @@ -1773,7 +1727,7 @@ void SwDrawContact::RemoveMasterFromDrawPage() GetMaster()->SetUserCall( 0 ); if ( GetMaster()->IsInserted() ) { - ((SwFrmFmt*)pRegisteredIn)->getIDocumentDrawModelAccess()->GetDrawModel()->GetPage(0)-> + ((SwFrmFmt*)GetRegisteredIn())->getIDocumentDrawModelAccess()->GetDrawModel()->GetPage(0)-> RemoveObject( GetMaster()->GetOrdNum() ); } } @@ -1859,13 +1813,10 @@ void SwDrawContact::ConnectToLayout( const SwFmtAnchor* pAnch ) } // <-- - SwFrmFmt* pDrawFrmFmt = (SwFrmFmt*)pRegisteredIn; + SwFrmFmt* pDrawFrmFmt = (SwFrmFmt*)GetRegisteredIn(); - SwRootFrm* pRoot = pDrawFrmFmt->getIDocumentLayoutAccess()->GetRootFrm(); - if ( !pRoot ) - { + if( !pDrawFrmFmt->getIDocumentLayoutAccess()->GetCurrentViewShell() ) return; - } // remove 'virtual' drawing objects from writer // layout and from drawing page, and remove 'master' drawing object from @@ -1882,6 +1833,10 @@ void SwDrawContact::ConnectToLayout( const SwFmtAnchor* pAnch ) case FLY_AT_PAGE: { sal_uInt16 nPgNum = pAnch->GetPageNum(); + ViewShell *pShell = pDrawFrmFmt->getIDocumentLayoutAccess()->GetCurrentViewShell(); + if( !pShell ) + break; + SwRootFrm* pRoot = pShell->GetLayout(); SwPageFrm *pPage = static_cast<SwPageFrm*>(pRoot->Lower()); for ( sal_uInt16 i = 1; i < nPgNum && pPage; ++i ) @@ -1920,8 +1875,7 @@ void SwDrawContact::ConnectToLayout( const SwFmtAnchor* pAnch ) { SwNodeIndex aIdx( pAnch->GetCntntAnchor()->nNode ); SwCntntNode* pCNd = pDrawFrmFmt->GetDoc()->GetNodes().GoNext( &aIdx ); - SwClientIter aIter( *pCNd ); - if ( aIter.First( TYPE(SwFrm) ) ) + if ( SwIterator<SwFrm,SwCntntNode>::FirstElement( *pCNd ) ) pModify = pCNd; else { @@ -1953,11 +1907,9 @@ void SwDrawContact::ConnectToLayout( const SwFmtAnchor* pAnch ) pModify = pAnch->GetCntntAnchor()->nNode.GetNode().GetCntntNode(); } } - SwClientIter aIter( *pModify ); + SwIterator<SwFrm,SwModify> aIter( *pModify ); SwFrm* pAnchorFrmOfMaster = 0; - for( SwFrm *pFrm = (SwFrm*)aIter.First( TYPE(SwFrm) ); - pFrm; - pFrm = (SwFrm*)aIter.Next() ) + for( SwFrm *pFrm = aIter.First(); pFrm; pFrm = aIter.Next() ) { // append drawing object, if // (1) proposed anchor frame isn't a follow and @@ -2110,7 +2062,7 @@ void SwDrawContact::ChangeMasterObject( SdrObject *pNewMaster ) } // get data collection of anchored objects, handled by with contact -void SwDrawContact::GetAnchoredObjs( std::vector<SwAnchoredObject*>& _roAnchoredObjs ) const +void SwDrawContact::GetAnchoredObjs( std::list<SwAnchoredObject*>& _roAnchoredObjs ) const { _roAnchoredObjs.push_back( const_cast<SwAnchoredDrawObject*>(&maAnchoredDrawObj) ); diff --git a/sw/source/core/draw/dflyobj.cxx b/sw/source/core/draw/dflyobj.cxx index 096386733626..a350cc1772e1 100644 --- a/sw/source/core/draw/dflyobj.cxx +++ b/sw/source/core/draw/dflyobj.cxx @@ -55,6 +55,7 @@ #include "ndnotxt.hxx" #include "grfatr.hxx" #include "pagefrm.hxx" +#include "rootfrm.hxx" using namespace ::com::sun::star; @@ -457,7 +458,7 @@ SwFrmFmt *SwVirtFlyDrawObj::GetFmt() void SwVirtFlyDrawObj::wrap_DoPaintObject() const { - ViewShell* pShell = pFlyFrm->GetShell(); + ViewShell* pShell = pFlyFrm->getRootFrm()->GetCurrShell(); // Only paint when we have a current shell and a DrawingLayer paint is in progress. // This avcoids evtl. problems with renderers which do processing stuff, @@ -817,9 +818,9 @@ void SwVirtFlyDrawObj::NbcResize(const Point& rRef, const SwFrm *pRel = GetFlyFrm()->IsFlyLayFrm() ? GetFlyFrm()->GetAnchorFrm() : GetFlyFrm()->GetAnchorFrm()->GetUpper(); - const ViewShell *pSh = GetFlyFrm()->GetShell(); + const ViewShell *pSh = GetFlyFrm()->getRootFrm()->GetCurrShell(); if ( pSh && pRel->IsBodyFrm() && - pFmt->getIDocumentSettingAccess()->get(IDocumentSettingAccess::BROWSE_MODE) && + pSh->GetViewOptions()->getBrowseMode() && pSh->VisArea().HasArea() ) { nRelWidth = pSh->GetBrowseWidth(); diff --git a/sw/source/core/draw/dpage.cxx b/sw/source/core/draw/dpage.cxx index b39bd6521a76..b47d1a1c134c 100644 --- a/sw/source/core/draw/dpage.cxx +++ b/sw/source/core/draw/dpage.cxx @@ -108,7 +108,7 @@ void InsertGridFrame( SdrPageGridFrameList *pLst, const SwFrm *pPg ) const SdrPageGridFrameList* SwDPage::GetGridFrameList( const SdrPageView* pPV, const Rectangle *pRect ) const { - ViewShell *pSh = ((SwDrawDocument*)GetModel())->GetDoc().GetRootFrm()->GetCurrShell(); + ViewShell *pSh = ((SwDrawDocument*)GetModel())->GetDoc().GetCurrentViewShell(); //swmod 071108//swmod 071225 if ( pSh ) { while ( pSh->Imp()->GetPageView() != pPV ) diff --git a/sw/source/core/draw/dview.cxx b/sw/source/core/draw/dview.cxx index 658bbbf802c2..4827627f6ef1 100644 --- a/sw/source/core/draw/dview.cxx +++ b/sw/source/core/draw/dview.cxx @@ -423,7 +423,7 @@ void SwDrawView::_MoveRepeatedObjs( const SwAnchoredObject& _rMovedAnchoredObj, const std::vector<SdrObject*>& _rMovedChildObjs ) const { // determine 'repeated' objects of already moved object <_rMovedAnchoredObj> - std::vector<SwAnchoredObject*> aAnchoredObjs; + std::list<SwAnchoredObject*> aAnchoredObjs; { const SwContact* pContact = ::GetUserCall( _rMovedAnchoredObj.GetDrawObj() ); OSL_ENSURE( pContact, @@ -1042,8 +1042,9 @@ void SwDrawView::ReplaceMarkedDrawVirtObjs( SdrMarkView& _rMarkView ) void SwDrawView::DeleteMarked() { SwDoc* pDoc = Imp().GetShell()->GetDoc(); - if ( pDoc->GetRootFrm() ) - pDoc->GetRootFrm()->StartAllAction(); + SwRootFrm *pTmpRoot = pDoc->GetCurrentLayout();//swmod 080317 + if ( pTmpRoot ) + pTmpRoot->StartAllAction(); pDoc->GetIDocumentUndoRedo().StartUndo(UNDO_EMPTY, NULL); // replace marked <SwDrawVirtObj>-objects by its reference objects. { @@ -1063,11 +1064,8 @@ void SwDrawView::DeleteMarked() ::FrameNotify( Imp().GetShell(), FLY_DRAG_END ); } pDoc->GetIDocumentUndoRedo().EndUndo(UNDO_EMPTY, NULL); - if( pDoc->GetRootFrm() ) - pDoc->GetRootFrm()->EndAllAction(); + if( pTmpRoot ) + pTmpRoot->EndAllAction(); //swmod 080218 } - - - /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/source/core/edit/acorrect.cxx b/sw/source/core/edit/acorrect.cxx index c047543e4bf9..a9ab99f2ee4b 100644..100755 --- a/sw/source/core/edit/acorrect.cxx +++ b/sw/source/core/edit/acorrect.cxx @@ -158,6 +158,10 @@ sal_Bool SwAutoCorrDoc::Insert( xub_StrLen nPos, const String& rTxt ) sal_Bool SwAutoCorrDoc::Replace( xub_StrLen nPos, const String& rTxt ) { + return ReplaceRange( nPos, rTxt.Len(), rTxt ); +} +sal_Bool SwAutoCorrDoc::ReplaceRange( xub_StrLen nPos, xub_StrLen nSourceLength, const String& rTxt ) +{ SwPaM* pPam = &rCrsr; if( pPam->GetPoint()->nContent.GetIndex() != nPos ) { @@ -201,14 +205,26 @@ sal_Bool SwAutoCorrDoc::Replace( xub_StrLen nPos, const String& rTxt ) pPam->SetMark(); pPam->GetPoint()->nContent = Min( pNd->GetTxt().Len(), - xub_StrLen( nPos + rTxt.Len() )); + xub_StrLen( nPos + nSourceLength )); pDoc->ReplaceRange( *pPam, rTxt, false ); pPam->Exchange(); pPam->DeleteMark(); } } else - pDoc->Overwrite( *pPam, rTxt ); + { + if( nSourceLength != rTxt.Len() ) + { + pPam->SetMark(); + pPam->GetPoint()->nContent = Min( pNd->GetTxt().Len(), + xub_StrLen( nPos + nSourceLength )); + pDoc->ReplaceRange( *pPam, rTxt, false ); + pPam->Exchange(); + pPam->DeleteMark(); + } + else + pDoc->Overwrite( *pPam, rTxt ); + } // pDoc->SetRedlineMode_intern( eOld ); if( bUndoIdInitialized ) diff --git a/sw/source/core/edit/autofmt.cxx b/sw/source/core/edit/autofmt.cxx index 5658526ea35d..4400b66b1704 100644 --- a/sw/source/core/edit/autofmt.cxx +++ b/sw/source/core/edit/autofmt.cxx @@ -269,7 +269,7 @@ const sal_Unicode* StrChr( const sal_Unicode* pSrc, sal_Unicode c ) SwTxtFrm* SwAutoFormat::GetFrm( const SwTxtNode& rTxtNd ) const { // get the Frame - const SwCntntFrm *pFrm = rTxtNd.GetFrm(); + const SwCntntFrm *pFrm = rTxtNd.getLayoutFrm( pEditShell->GetLayout() ); OSL_ENSURE( pFrm, "zum Autoformat muss das Layout vorhanden sein" ); if( aFlags.bAFmtByInput && !pFrm->IsValid() ) { @@ -1526,6 +1526,9 @@ void SwAutoFormat::BuildEnum( sal_uInt16 nLvl, sal_uInt16 nDigitLevel ) aFmt.SetBulletFont( pBullFnt ); aFmt.SetBulletChar( cBullChar ); aFmt.SetNumberingType(SVX_NUM_CHAR_SPECIAL); + // #i93908# clear suffix for bullet lists + aFmt.SetPrefix(::rtl::OUString()); + aFmt.SetSuffix(::rtl::OUString()); aFmt.SetFirstLineOffset( lBullFirstLineOffset ); aFmt.SetAbsLSpace( nAbsPos ); if( !aFmt.GetCharFmt() ) diff --git a/sw/source/core/edit/edattr.cxx b/sw/source/core/edit/edattr.cxx index e55b8c3f05ed..a67663445a85 100644 --- a/sw/source/core/edit/edattr.cxx +++ b/sw/source/core/edit/edattr.cxx @@ -343,7 +343,7 @@ sal_Bool SwEditShell::IsMoveLeftMargin( sal_Bool bRight, sal_Bool bModulus ) con long nNext = rLS.GetTxtLeft() + nDefDist; if( bModulus ) nNext = ( nNext / nDefDist ) * nDefDist; - SwFrm* pFrm = pCNd->GetFrm(); + SwFrm* pFrm = pCNd->getLayoutFrm( GetLayout() ); if ( pFrm ) { const sal_uInt16 nFrmWidth = static_cast<sal_uInt16>( pFrm->IsVertical() ? diff --git a/sw/source/core/edit/eddel.cxx b/sw/source/core/edit/eddel.cxx index e6b111dd38f1..494f780898df 100644 --- a/sw/source/core/edit/eddel.cxx +++ b/sw/source/core/edit/eddel.cxx @@ -91,7 +91,7 @@ void SwEditShell::DeleteSel( SwPaM& rPam, sal_Bool* pUndo ) } // geschuetze Boxen ueberspringen ! if( !pNd->IsCntntNode() || - !((SwCntntNode*)pNd)->GetFrm()->IsProtected() ) + !((SwCntntNode*)pNd)->getLayoutFrm( GetLayout() )->IsProtected() ) { // alles loeschen GetDoc()->DeleteAndJoin( aDelPam ); diff --git a/sw/source/core/edit/edfld.cxx b/sw/source/core/edit/edfld.cxx index 8e20335fe89f..58005a97832b 100644 --- a/sw/source/core/edit/edfld.cxx +++ b/sw/source/core/edit/edfld.cxx @@ -46,7 +46,8 @@ #include <dbmgr.hxx> #include <swddetbl.hxx> #include <hints.hxx> - +#include <switerator.hxx> +#include <fieldhint.hxx> /*-------------------------------------------------------------------- Beschreibung: Feldtypen zu einer ResId zaehlen @@ -201,45 +202,13 @@ void SwEditShell::FieldToText( SwFieldType* pType ) Push(); SwPaM* pPaM = GetCrsr(); - sal_Bool bDDEFld = RES_DDEFLD == pType->Which(); - // Modify-Object gefunden, trage alle Felder ins Array ein + SwFieldHint aHint( pPaM ); SwClientIter aIter( *pType ); - SwClient * pLast = aIter.GoStart(); - - if( pLast ) // konnte zum Anfang gesprungen werden ?? - do { - pPaM->DeleteMark(); - const SwFmtFld* pFmtFld = bDDEFld - ? PTR_CAST( SwFmtFld, pLast ) - : (SwFmtFld*)pLast; - - if( pFmtFld ) - { - if( !pFmtFld->GetTxtFld() ) - continue; - - // kann keine DDETabelle sein - const SwTxtNode& rTxtNode = pFmtFld->GetTxtFld()->GetTxtNode(); - pPaM->GetPoint()->nNode = rTxtNode; - pPaM->GetPoint()->nContent.Assign( (SwTxtNode*)&rTxtNode, - *pFmtFld->GetTxtFld()->GetStart() ); - - // Feldinhalt durch Text ersetzen - String const aEntry( pFmtFld->GetFld()->ExpandField(true) ); - pPaM->SetMark(); - pPaM->Move( fnMoveForward ); - GetDoc()->DeleteRange( *pPaM ); - GetDoc()->InsertString( *pPaM, aEntry ); - } - else if( bDDEFld ) - { - // DDETabelle - SwDepend* pDep = (SwDepend*)pLast; - SwDDETable* pDDETbl = (SwDDETable*)pDep->GetToTell(); - pDDETbl->NoDDETable(); - } - - } while( 0 != ( pLast = aIter++ )); + for ( SwClient* pClient = aIter.GoStart(); pClient; aIter++ ) + { + pPaM->DeleteMark(); + pClient->SwClientNotifyCall( *pType, aHint ); + } Pop( sal_False ); EndAllAction(); @@ -569,13 +538,13 @@ sal_Bool SwEditShell::IsAnyDatabaseFieldInDoc()const case RES_DBNUMSETFLD: case RES_DBSETNUMBERFLD: { - SwClientIter aIter( rFldType ); - SwFmtFld* pFld = (SwFmtFld*)aIter.First( TYPE( SwFmtFld )); + SwIterator<SwFmtFld,SwFieldType> aIter( rFldType ); + SwFmtFld* pFld = aIter.First(); while(pFld) { if(pFld->IsFldInDoc()) return sal_True; - pFld = (SwFmtFld*)aIter.Next(); + pFld = aIter.Next(); } } break; diff --git a/sw/source/core/edit/edfldexp.cxx b/sw/source/core/edit/edfldexp.cxx index a506445ad10f..0bc650313adc 100644 --- a/sw/source/core/edit/edfldexp.cxx +++ b/sw/source/core/edit/edfldexp.cxx @@ -41,6 +41,7 @@ #include <fmtfld.hxx> #include <edimp.hxx> #include <flddat.hxx> +#include <switerator.hxx> using namespace com::sun::star; using ::rtl::OUString; @@ -66,8 +67,8 @@ sal_Bool SwEditShell::IsFieldDataSourceAvailable(String& rUsedDataSource) const { case RES_DBFLD: { - SwClientIter aIter( rFldType ); - SwFmtFld* pFld = (SwFmtFld*)aIter.First( TYPE( SwFmtFld )); + SwIterator<SwFmtFld,SwFieldType> aIter( rFldType ); + SwFmtFld* pFld = aIter.First(); while(pFld) { if(pFld->IsFldInDoc()) @@ -84,7 +85,7 @@ sal_Bool SwEditShell::IsFieldDataSourceAvailable(String& rUsedDataSource) const return sal_False; } } - pFld = (SwFmtFld*)aIter.Next(); + pFld = aIter.Next(); } } break; diff --git a/sw/source/core/edit/editsh.cxx b/sw/source/core/edit/editsh.cxx index 729a9061cef3..5f428d85c4f9 100644 --- a/sw/source/core/edit/editsh.cxx +++ b/sw/source/core/edit/editsh.cxx @@ -68,7 +68,7 @@ #include <numrule.hxx> #include <SwNodeNum.hxx> #include <unocrsr.hxx> - +#include <switerator.hxx> using namespace com::sun::star; @@ -153,7 +153,7 @@ void SwEditShell::Insert2(const String &rStr, const bool bForceExpandHints ) // seems to be an empty paragraph. Point aPt; SwCntntFrm* pFrm = - ((SwTxtNode&)rNode).GetFrm( &aPt, pTmpCrsr->GetPoint(), + ((SwTxtNode&)rNode).getLayoutFrm( GetLayout(), &aPt, pTmpCrsr->GetPoint(), sal_False ); SwScriptInfo aScriptInfo; @@ -391,10 +391,9 @@ void SwEditShell::SetGraphicPolygon( const PolyPolygon *pPoly ) SwNoTxtNode *pNd = GetCrsr()->GetNode()->GetNoTxtNode(); StartAllAction(); pNd->SetContour( pPoly ); - SwFlyFrm *pFly = (SwFlyFrm*)pNd->GetFrm()->GetUpper(); + SwFlyFrm *pFly = (SwFlyFrm*)pNd->getLayoutFrm(GetLayout())->GetUpper(); const SwFmtSurround &rSur = pFly->GetFmt()->GetSurround(); - pFly->GetFmt()->SwModify::Modify( (SwFmtSurround*)&rSur, - (SwFmtSurround*)&rSur ); + pFly->GetFmt()->NotifyClients( (SwFmtSurround*)&rSur, (SwFmtSurround*)&rSur ); GetDoc()->SetModified(); EndAllAction(); } @@ -407,10 +406,9 @@ void SwEditShell::ClearAutomaticContour() { StartAllAction(); pNd->SetContour( NULL, sal_False ); - SwFlyFrm *pFly = (SwFlyFrm*)pNd->GetFrm()->GetUpper(); + SwFlyFrm *pFly = (SwFlyFrm*)pNd->getLayoutFrm(GetLayout())->GetUpper(); const SwFmtSurround &rSur = pFly->GetFmt()->GetSurround(); - pFly->GetFmt()->SwModify::Modify( (SwFmtSurround*)&rSur, - (SwFmtSurround*)&rSur ); + pFly->GetFmt()->NotifyClients( (SwFmtSurround*)&rSur, (SwFmtSurround*)&rSur ); GetDoc()->SetModified(); EndAllAction(); } @@ -449,7 +447,7 @@ sal_Bool SwEditShell::HasOLEObj( const String &rName ) const SwNode& rNd = aIdx.GetNode(); if( rNd.IsOLENode() && rName == ((SwOLENode&)rNd).GetChartTblName() && - ((SwOLENode&)rNd).GetFrm() ) + ((SwOLENode&)rNd).getLayoutFrm( GetLayout() ) ) return sal_True; aIdx.Assign( *pStNd->EndOfSectionNode(), + 1 ); @@ -701,7 +699,7 @@ Graphic SwEditShell::GetIMapGraphic() const } else { - SwFlyFrm* pFlyFrm = pNd->GetCntntNode()->GetFrm()->FindFlyFrm(); + SwFlyFrm* pFlyFrm = pNd->GetCntntNode()->getLayoutFrm( GetLayout() )->FindFlyFrm(); if(pFlyFrm) aRet = pFlyFrm->GetFmt()->MakeGraphic(); } @@ -775,14 +773,13 @@ sal_uInt16 SwEditShell::GetINetAttrs( SwGetINetAttrs& rArr ) const SwCharFmts* pFmts = GetDoc()->GetCharFmts(); for( sal_uInt16 n = pFmts->Count(); 1 < n; ) { - SwClientIter aIter( *(*pFmts)[ --n ] ); - - for( SwClient* pFnd = aIter.First(TYPE( SwTxtINetFmt )); - pFnd; pFnd = aIter.Next() ) - if( 0 != ( pTxtNd = ((SwTxtINetFmt*)pFnd)->GetpTxtNode()) && + SwIterator<SwTxtINetFmt,SwCharFmt> aIter(*(*pFmts)[--n]); + for( SwTxtINetFmt* pFnd = aIter.First(); pFnd; pFnd = aIter.Next() ) + { + if( 0 != ( pTxtNd = pFnd->GetpTxtNode()) && pTxtNd->GetNodes().IsDocNodes() ) { - SwTxtINetFmt& rAttr = *(SwTxtINetFmt*)pFnd; + SwTxtINetFmt& rAttr = *pFnd; String sTxt( pTxtNd->GetExpandTxt( *rAttr.GetStart(), *rAttr.GetEnd() - *rAttr.GetStart() ) ); @@ -796,6 +793,7 @@ sal_uInt16 SwEditShell::GetINetAttrs( SwGetINetAttrs& rArr ) } } } + } return rArr.Count(); } @@ -868,7 +866,7 @@ void SwEditShell::SetNumberingRestart() switch( pNd->GetNodeType() ) { case ND_TEXTNODE: - if( 0 != ( pCntFrm = ((SwTxtNode*)pNd)->GetFrm()) ) + if( 0 != ( pCntFrm = ((SwTxtNode*)pNd)->getLayoutFrm( GetLayout() )) ) { //jump over hidden frames - ignore protection! if( !((SwTxtFrm*)pCntFrm)->IsHiddenNow() ) @@ -936,7 +934,7 @@ sal_uInt16 SwEditShell::GetLineCount( sal_Bool bActPos ) else { if( 0 != ( pCNd = pPam->GetCntntNode() ) && - 0 != ( pCntFrm = pCNd->GetFrm() ) ) + 0 != ( pCntFrm = pCNd->getLayoutFrm( GetLayout() ) ) ) { const SwStartNode *pTmp; if( pCntFrm->IsInFly() ) // Fly @@ -964,7 +962,7 @@ sal_uInt16 SwEditShell::GetLineCount( sal_Bool bActPos ) while( 0 != ( pCNd = GetDoc()->GetNodes().GoNextSection( &aStart, sal_True, sal_False )) && ( !bActPos || aStart <= rPtIdx ) ) { - if( 0 != ( pCntFrm = pCNd->GetFrm() ) && pCntFrm->IsTxtFrm() ) + if( 0 != ( pCntFrm = pCNd->getLayoutFrm( GetLayout() ) ) && pCntFrm->IsTxtFrm() ) { xub_StrLen nActPos = bActPos && aStart == rPtIdx ? pPam->GetPoint()->nContent.GetIndex() : USHRT_MAX; @@ -1158,4 +1156,12 @@ void SwEditShell::CountWords( SwDocStat& rStat ) const FOREACHPAM_END() } +void SwEditShell::ApplyViewOptions( const SwViewOption &rOpt ) +{ + SwCrsrShell::StartAction(); + ViewShell::ApplyViewOptions( rOpt ); + SwEditShell::EndAction(); +} + + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/source/core/edit/edlingu.cxx b/sw/source/core/edit/edlingu.cxx index 65ae73daa6e1..f90ebe45748f 100644 --- a/sw/source/core/edit/edlingu.cxx +++ b/sw/source/core/edit/edlingu.cxx @@ -65,7 +65,7 @@ #include <docary.hxx> // SwRedlineTbl #include <docsh.hxx> #include <txatbase.hxx> - +#include <txtfrm.hxx> using namespace ::svx; using namespace ::com::sun::star; @@ -73,8 +73,6 @@ using namespace ::com::sun::star::uno; using namespace ::com::sun::star::beans; using namespace ::com::sun::star::linguistic2; -extern void repaintTextFrames( SwModify& rModify ); - /************************************************************************* * class SwLinguIter *************************************************************************/ @@ -1082,7 +1080,7 @@ uno::Reference< XSpellAlternatives > SwCrsrMoveState aState; aState.bRealWidth = sal_True; SwCntntNode* pCntntNode = pCrsr->GetCntntNode(); - SwCntntFrm *pCntntFrame = pCntntNode->GetFrm(pPt, pCrsr->GetPoint(), sal_False); + SwCntntFrm *pCntntFrame = pCntntNode->getLayoutFrm( GetLayout(), pPt, pCrsr->GetPoint(), sal_False); pCntntFrame->GetCharRect( aStartRect, *pCrsr->GetPoint(), &aState ); rContent = nWordEnd - 1; @@ -1214,7 +1212,7 @@ bool SwEditShell::GetGrammarCorrection( SwCrsrMoveState aState; aState.bRealWidth = sal_True; SwCntntNode* pCntntNode = pCrsr->GetCntntNode(); - SwCntntFrm *pCntntFrame = pCntntNode->GetFrm(pPt, pCrsr->GetPoint(), sal_False); + SwCntntFrm *pCntntFrame = pCntntNode->getLayoutFrm( GetLayout(), pPt, pCrsr->GetPoint(), sal_False); pCntntFrame->GetCharRect( aStartRect, *pCrsr->GetPoint(), &aState ); rContent = nWordEnd - 1; @@ -1918,7 +1916,7 @@ void SwEditShell::IgnoreGrammarErrorAt( SwPaM& rErrorPosition ) pWrong = pNode->GetWrong(); if( pWrong ) pWrong->RemoveEntry( nStart, nEnd ); - ::repaintTextFrames( *pNode ); + SwTxtFrm::repaintTextFrames( *pNode ); } ++aIdx; nStart = 0; diff --git a/sw/source/core/edit/edsect.cxx b/sw/source/core/edit/edsect.cxx index 62463af9f947..25e4dcb434af 100644 --- a/sw/source/core/edit/edsect.cxx +++ b/sw/source/core/edit/edsect.cxx @@ -104,7 +104,7 @@ const SwSection* SwEditShell::GetAnySection( sal_Bool bOutOfTab, const Point* pP Point aPt( *pPt ); GetLayout()->GetCrsrOfst( &aPos, aPt ); SwCntntNode *pNd = aPos.nNode.GetNode().GetCntntNode(); - pFrm = pNd->GetFrm( pPt ); + pFrm = pNd->getLayoutFrm( GetLayout(), pPt ); } else pFrm = GetCurrFrm( sal_False ); diff --git a/sw/source/core/edit/edtox.cxx b/sw/source/core/edit/edtox.cxx index b86a70f01be5..1bbf0b3b9e9a 100644 --- a/sw/source/core/edit/edtox.cxx +++ b/sw/source/core/edit/edtox.cxx @@ -331,13 +331,15 @@ void SwEditShell::ApplyAutoMark() { //1. const SwTOXType* pTOXType = GetTOXType(TOX_INDEX, 0); - SwClientIter aIter(*(SwTOXType*)pTOXType); - SwTOXMark* pMark = (SwTOXMark*)aIter.First(TYPE(SwTOXMark)); - while( pMark ) + + SwTOXMarks aMarks; + SwTOXMark::InsertTOXMarks( aMarks, *pTOXType ); + for( sal_uInt16 nMark=0; nMark<aMarks.Count(); nMark++ ) { + SwTOXMark* pMark = aMarks[nMark]; if(pMark->IsAutoGenerated() && pMark->GetTxtTOXMark()) + // mba: test iteration; objects are deleted in iteration DeleteTOXMark(pMark); - pMark = (SwTOXMark*)aIter.Next(); } //2. diff --git a/sw/source/core/edit/edundo.cxx b/sw/source/core/edit/edundo.cxx index 8366ec3bf6fc..0ee3879c48c5 100644 --- a/sw/source/core/edit/edundo.cxx +++ b/sw/source/core/edit/edundo.cxx @@ -239,10 +239,16 @@ void lcl_SelectSdrMarkList( SwEditShell* pShell, if( pShell->ISA( SwFEShell ) ) { SwFEShell* pFEShell = static_cast<SwFEShell*>( pShell ); + bool bFirst = true; for( sal_uInt16 i = 0; i < pSdrMarkList->GetMarkCount(); ++i ) - pFEShell->SelectObj( Point(), - (i==0) ? 0 : SW_ADD_SELECT, - pSdrMarkList->GetMark( i )->GetMarkedSdrObj() ); + { + SdrObject *pObj = pSdrMarkList->GetMark( i )->GetMarkedSdrObj(); + if( pObj ) + { + pFEShell->SelectObj( Point(), bFirst ? 0 : SW_ADD_SELECT, pObj ); + bFirst = false; + } + } // the old implementation would always unselect // objects, even if no new ones were selected. If this diff --git a/sw/source/core/fields/authfld.cxx b/sw/source/core/fields/authfld.cxx index e1d88e187988..53052fb9ef08 100644 --- a/sw/source/core/fields/authfld.cxx +++ b/sw/source/core/fields/authfld.cxx @@ -54,7 +54,7 @@ #include <doc.hxx> #include <unofldmid.h> #include <unoprnms.hxx> - +#include <switerator.hxx> #include <unomid.h> using namespace ::com::sun::star::uno; @@ -87,7 +87,6 @@ sal_Bool SwAuthEntry::operator==(const SwAuthEntry& rComp) return sal_True; } // -------------------------------------------------------- - SwAuthorityFieldType::SwAuthorityFieldType(SwDoc* pDoc) : SwFieldType( RES_AUTHORITY ), m_pDoc(pDoc), @@ -270,9 +269,9 @@ bool SwAuthorityFieldType::ChangeEntryContent(const SwAuthEntry* pNewEntry) } return bChanged; } -/*----------------------------------------------------------------------- - Description: appends a new entry (if new) and returns the array position +/*------------------------------------------------------------------------- + appends a new entry (if new) and returns the array position -----------------------------------------------------------------------*/ sal_uInt16 SwAuthorityFieldType::AppendField( const SwAuthEntry& rInsert ) { @@ -316,12 +315,11 @@ sal_uInt16 SwAuthorityFieldType::GetSequencePos(long nHandle) if(m_SequArr.empty()) { SwTOXSortTabBases aSortArr; - SwClientIter aIter( *this ); + SwIterator<SwFmtFld,SwFieldType> aIter( *this ); SwTOXInternational aIntl(m_eLanguage, 0, m_sSortAlgorithm); - for( SwFmtFld* pFmtFld = (SwFmtFld*)aIter.First( TYPE(SwFmtFld) ); - pFmtFld; pFmtFld = (SwFmtFld*)aIter.Next() ) + for( SwFmtFld* pFmtFld = aIter.First(); pFmtFld; pFmtFld = aIter.Next() ) { const SwTxtFld* pTxtFld = pFmtFld->GetTxtFld(); if(!pTxtFld || !pTxtFld->GetpTxtNode()) @@ -335,7 +333,7 @@ sal_uInt16 SwAuthorityFieldType::GetSequencePos(long nHandle) const SwTxtNode& rFldTxtNode = pTxtFld->GetTxtNode(); SwPosition aFldPos(rFldTxtNode); SwDoc& rDoc = *(SwDoc*)rFldTxtNode.GetDoc(); - SwCntntFrm *pFrm = rFldTxtNode.GetFrm(); + SwCntntFrm *pFrm = rFldTxtNode.getLayoutFrm( rDoc.GetCurrentLayout() ); const SwTxtNode* pTxtNode = 0; if(pFrm && !pFrm->IsInDocBody()) pTxtNode = GetBodyTxtNode( rDoc, aFldPos, *pFrm ); @@ -343,7 +341,7 @@ sal_uInt16 SwAuthorityFieldType::GetSequencePos(long nHandle) //body the directly available text node will be used if(!pTxtNode) pTxtNode = &rFldTxtNode; - if( pTxtNode->GetTxt().Len() && pTxtNode->GetFrm() && + if( pTxtNode->GetTxt().Len() && pTxtNode->getLayoutFrm( rDoc.GetCurrentLayout() ) && pTxtNode->GetNodes().IsDocNodes() ) { SwTOXAuthority* pNew = new SwTOXAuthority( *pTxtNode, @@ -404,7 +402,6 @@ sal_uInt16 SwAuthorityFieldType::GetSequencePos(long nHandle) return nRet; } - bool SwAuthorityFieldType::QueryValue( Any& rVal, sal_uInt16 nWhichId ) const { switch( nWhichId ) @@ -533,11 +530,11 @@ bool SwAuthorityFieldType::PutValue( const Any& rAny, sal_uInt16 nWhichId ) return bRet; } -void SwAuthorityFieldType::Modify( SfxPoolItem *pOld, SfxPoolItem *pNew ) +void SwAuthorityFieldType::Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew ) { //re-generate positions of the fields DelSequenceArray(); - SwModify::Modify( pOld, pNew ); + NotifyClients( pOld, pNew ); } sal_uInt16 SwAuthorityFieldType::GetSortKeyCount() const diff --git a/sw/source/core/fields/cellfml.cxx b/sw/source/core/fields/cellfml.cxx index 12b2d4ede232..c27498819ee7 100644 --- a/sw/source/core/fields/cellfml.cxx +++ b/sw/source/core/fields/cellfml.cxx @@ -718,15 +718,13 @@ const SwTable* SwTableFormula::FindTable( SwDoc& rDoc, const String& rNm ) const return pRet; } -/* */ - const SwFrm* lcl_GetBoxFrm( const SwTableBox& rBox ) { SwNodeIndex aIdx( *rBox.GetSttNd() ); SwCntntNode* pCNd = aIdx.GetNodes().GoNext( &aIdx ); OSL_ENSURE( pCNd, "Box hat keinen TextNode" ); Point aPt; // den im Layout 1. Frame returnen - Tab.Kopfzeile !! - return pCNd->GetFrm( &aPt, NULL, sal_False ); + return pCNd->getLayoutFrm( pCNd->GetDoc()->GetCurrentLayout(), &aPt, NULL, sal_False ); } long lcl_GetLongBoxNum( String& rStr ) diff --git a/sw/source/core/fields/dbfld.cxx b/sw/source/core/fields/dbfld.cxx index 8f1e6bd16c87..3eb1f758f3ee 100644 --- a/sw/source/core/fields/dbfld.cxx +++ b/sw/source/core/fields/dbfld.cxx @@ -49,7 +49,7 @@ #include <expfld.hxx> #include <txtatr.hxx> #include <unofldmid.h> - +#include <switerator.hxx> using namespace ::com::sun::star::sdbc; using namespace ::com::sun::star; @@ -163,8 +163,8 @@ bool SwDBFieldType::PutValue( const uno::Any& rAny, sal_uInt16 nWhichId ) if( sTmp != sColumn ) { sColumn = sTmp; - SwClientIter aIter( *this ); - SwFmtFld* pFld = (SwFmtFld*)aIter.First( TYPE( SwFmtFld )); + SwIterator<SwFmtFld,SwFieldType> aIter( *this ); + SwFmtFld* pFld = aIter.First(); while(pFld) { // Feld im Undo? @@ -175,7 +175,7 @@ bool SwDBFieldType::PutValue( const uno::Any& rAny, sal_uInt16 nWhichId ) pDBField->ClearInitialized(); pDBField->InitContent(); } - pFld = (SwFmtFld*)aIter.Next(); + pFld = aIter.Next(); } } } @@ -448,8 +448,8 @@ bool SwDBField::PutValue( const uno::Any& rAny, sal_uInt16 nWhichId ) //invalidate text node if(GetTyp()) { - SwClientIter aIter( *GetTyp() ); - SwFmtFld* pFld = (SwFmtFld*)aIter.First( TYPE( SwFmtFld )); + SwIterator<SwFmtFld,SwFieldType> aIter( *GetTyp() ); + SwFmtFld* pFld = aIter.First(); while(pFld) { SwTxtFld *pTxtFld = pFld->GetTxtFld(); @@ -459,7 +459,7 @@ bool SwDBField::PutValue( const uno::Any& rAny, sal_uInt16 nWhichId ) pTxtFld->NotifyContentChange(*pFld); break; } - pFld = (SwFmtFld*)aIter.Next(); + pFld = aIter.Next(); } } } @@ -922,7 +922,6 @@ String SwDBSetNumberField::Expand() const return aEmptyStr; else return FormatNumber((sal_uInt16)nNumber, GetFormat()); - //return(nNumber == 0 ? aEmptyStr : FormatNumber(nNumber, GetFormat())); } //------------------------------------------------------------------------------ diff --git a/sw/source/core/fields/ddefld.cxx b/sw/source/core/fields/ddefld.cxx index 464525ede506..4c6e08187c75 100644 --- a/sw/source/core/fields/ddefld.cxx +++ b/sw/source/core/fields/ddefld.cxx @@ -122,7 +122,7 @@ void SwIntrnlRefLink::DataChanged( const String& rMimeType, int bCallModify = sal_False; rFldType.LockModify(); - SwClientIter aIter( rFldType ); + SwClientIter aIter( rFldType ); // TODO SwClient * pLast = aIter.GoStart(); if( pLast ) // konnte zum Anfang gesprungen werden ?? do { @@ -137,7 +137,7 @@ void SwIntrnlRefLink::DataChanged( const String& rMimeType, else if( pSh ) pSh->StartAction(); } - pLast->Modify( 0, &aUpdateDDE ); + pLast->ModifyNotification( 0, &aUpdateDDE ); bCallModify = sal_True; } } while( 0 != ( pLast = aIter++ )); @@ -184,7 +184,7 @@ const SwNode* SwIntrnlRefLink::GetAnchor() const { // hier sollte irgend ein Anchor aus dem normalen Nodes-Array reichen const SwNode* pNd = 0; - SwClientIter aIter( rFldType ); + SwClientIter aIter( rFldType ); // TODO SwClient * pLast = aIter.GoStart(); if( pLast ) // konnte zum Anfang gesprungen werden ?? do { @@ -211,7 +211,7 @@ sal_Bool SwIntrnlRefLink::IsInRange( sal_uLong nSttNd, sal_uLong nEndNd, { // hier sollte irgend ein Anchor aus dem normalen Nodes-Array reichen SwNodes* pNds = &rFldType.GetDoc()->GetNodes(); - SwClientIter aIter( rFldType ); + SwClientIter aIter( rFldType ); // TODO SwClient * pLast = aIter.GoStart(); if( pLast ) // konnte zum Anfang gesprungen werden ?? do { @@ -317,7 +317,7 @@ void SwDDEFieldType::_RefCntChgd() { refLink->SetVisible( pDoc->IsVisibleLinks() ); pDoc->GetLinkManager().InsertDDELink( refLink ); - if( pDoc->GetRootFrm() ) + if( pDoc->GetCurrentViewShell() ) //swmod 071108//swmod 071225 UpdateNow(); } else @@ -393,8 +393,8 @@ SwDDEField::SwDDEField( SwDDEFieldType* pInitType ) SwDDEField::~SwDDEField() { - if( GetTyp()->IsLastDepend() ) // der Letzte mach das - ((SwDDEFieldType*)GetTyp())->Disconnect(); // Licht aus + if( GetTyp()->IsLastDepend() ) + ((SwDDEFieldType*)GetTyp())->Disconnect(); } String SwDDEField::Expand() const diff --git a/sw/source/core/fields/ddetbl.cxx b/sw/source/core/fields/ddetbl.cxx index c10ea7d2895f..e520cdbda4f2 100644 --- a/sw/source/core/fields/ddetbl.cxx +++ b/sw/source/core/fields/ddetbl.cxx @@ -40,7 +40,7 @@ #include <ndindex.hxx> #include <fldupde.hxx> #include <swtblfmt.hxx> - +#include <fieldhint.hxx> TYPEINIT1( SwDDETable, SwTable ); @@ -63,10 +63,12 @@ SwDDETable::SwDDETable( SwTable& rTable, SwDDEFieldType* pDDEType, const SwNode& rNd = *GetTabSortBoxes()[0]->GetSttNd(); if( rNd.GetNodes().IsDocNodes() ) { - // "aktivieren der Updates" (Modify nicht noch mal rufen) - aDepend.LockModify(); + // mba: swclient refactoring - this code shouldn't have done anything! + // the ModifyLock Flag is evaluated in SwModify only, though it was accessible via SwClient + // This has been fixed now +// aDepend.LockModify(); pDDEType->IncRefCnt(); - aDepend.UnlockModify(); +// aDepend.UnlockModify(); // Setzen der Werte in die einzelnen Boxen // update box content only if update flag is set (false in import) @@ -92,7 +94,7 @@ SwDDETable::~SwDDETable() } } -void SwDDETable::Modify( SfxPoolItem* pOld, SfxPoolItem* pNew ) +void SwDDETable::Modify( const SfxPoolItem* pOld, const SfxPoolItem* pNew ) { if( pNew && RES_UPDATEDDETBL == pNew->Which() ) ChangeContent(); @@ -100,6 +102,14 @@ void SwDDETable::Modify( SfxPoolItem* pOld, SfxPoolItem* pNew ) SwTable::Modify( pOld, pNew ); } +void SwDDETable::SwClientNotify( const SwModify&, const SfxHint& rHint ) +{ + const SwFieldHint* pHint = dynamic_cast<const SwFieldHint*>( &rHint ); + if ( pHint ) + // replace DDETable by real table + NoDDETable(); +} + void SwDDETable::ChangeContent() { OSL_ENSURE( GetFrmFmt(), "Kein FrameFormat" ); @@ -177,7 +187,7 @@ sal_Bool SwDDETable::NoDDETable() pNewTbl->GetTabLines().Insert( &GetTabLines(),0 ); // move die Lines GetTabLines().Remove( 0, GetTabLines().Count() ); - if( pDoc->GetRootFrm() ) + if( pDoc->GetCurrentViewShell() ) //swmod 071108//swmod 071225 ((SwDDEFieldType*)aDepend.GetRegisteredIn())->DecRefCnt(); pTblNd->SetNewTable( pNewTbl ); // setze die Tabelle diff --git a/sw/source/core/fields/docufld.cxx b/sw/source/core/fields/docufld.cxx index a26c1facd378..cf340a808417 100644 --- a/sw/source/core/fields/docufld.cxx +++ b/sw/source/core/fields/docufld.cxx @@ -103,6 +103,7 @@ #include <editeng/outliner.hxx> #include <editeng/outlobj.hxx> +#include <switerator.hxx> #define URL_DECODE INetURLObject::DECODE_UNAMBIGUOUS @@ -176,14 +177,11 @@ void SwPageNumberFieldType::ChangeExpansion( SwDoc* pDoc, sal_uInt16 nPage, if( 0 != (pDesc = (SwFmtPageDesc*)rPool.GetItem2( RES_PAGEDESC, n ) ) && pDesc->GetNumOffset() && pDesc->GetDefinedIn() ) { - if( pDesc->GetDefinedIn()->ISA( SwCntntNode )) + SwCntntNode* pNd = PTR_CAST( SwCntntNode, pDesc->GetDefinedIn() ); + if( pNd ) { - SwClientIter aIter( *(SwModify*)pDesc->GetDefinedIn() ); - if( aIter.First( TYPE( SwFrm ) ) ) - { + if ( SwIterator<SwFrm,SwCntntNode>::FirstElement(*pNd) ) bVirtuell = sal_True; - break; - } } else if( pDesc->GetDefinedIn()->ISA( SwFmt )) { @@ -774,8 +772,8 @@ String SwDocStatFieldType::Expand(sal_uInt16 nSubType, sal_uInt32 nFmt) const case DS_WORD: nVal = rDStat.nWord; break; case DS_CHAR: nVal = rDStat.nChar; break; case DS_PAGE: - if( pDoc->GetRootFrm() ) - ((SwDocStat &)rDStat).nPage = pDoc->GetRootFrm()->GetPageNum(); + if( pDoc->GetCurrentLayout() )//swmod 080218 + ((SwDocStat &)rDStat).nPage = pDoc->GetCurrentLayout()->GetPageNum(); //swmod 080218 nVal = rDStat.nPage; if( SVX_NUM_PAGEDESC == nFmt ) nFmt = (sal_uInt32)nNumberingType; @@ -885,7 +883,6 @@ SwDocInfoFieldType::SwDocInfoFieldType(SwDoc* pDc) { } - SwFieldType* SwDocInfoFieldType::Copy() const { SwDocInfoFieldType* pTyp = new SwDocInfoFieldType(GetDoc()); @@ -905,7 +902,6 @@ void lcl_GetLocalDataWrapper( sal_uLong nLang, SvxCreateLocale( static_cast<LanguageType>(nLang) ) ); } - String SwDocInfoFieldType::Expand( sal_uInt16 nSub, sal_uInt32 nFormat, sal_uInt16 nLang, const String& rName ) const { @@ -1053,7 +1049,6 @@ String SwDocInfoFieldType::Expand( sal_uInt16 nSub, sal_uInt32 nFormat, return aStr; } - SwDocInfoField::SwDocInfoField(SwDocInfoFieldType* pTyp, sal_uInt16 nSub, const String& rName, sal_uInt32 nFmt) : SwValueField(pTyp, nFmt), nSubType(nSub) { @@ -2074,7 +2069,7 @@ SwFieldType* SwRefPageSetFieldType::Copy() const } // ueberlagert, weil es nichts zum Updaten gibt! -void SwRefPageSetFieldType::Modify( SfxPoolItem *, SfxPoolItem * ) +void SwRefPageSetFieldType::Modify( const SfxPoolItem*, const SfxPoolItem * ) { } @@ -2155,7 +2150,7 @@ SwFieldType* SwRefPageGetFieldType::Copy() const return pNew; } -void SwRefPageGetFieldType::Modify( SfxPoolItem* pOld, SfxPoolItem* pNew ) +void SwRefPageGetFieldType::Modify( const SfxPoolItem* pOld, const SfxPoolItem* pNew ) { // Update auf alle GetReferenz-Felder if( !pNew && !pOld && GetDepends() ) @@ -2164,28 +2159,24 @@ void SwRefPageGetFieldType::Modify( SfxPoolItem* pOld, SfxPoolItem* pNew ) _SetGetExpFlds aTmpLst( 10, 5 ); if( MakeSetList( aTmpLst ) ) { - SwClientIter aIter( *this ); - if( aIter.GoStart() ) - do { + SwIterator<SwFmtFld,SwFieldType> aIter( *this ); + for ( SwFmtFld* pFmtFld = aIter.First(); pFmtFld; pFmtFld = aIter.Next() ) // nur die GetRef-Felder Updaten - SwFmtFld* pFmtFld = (SwFmtFld*)aIter(); if( pFmtFld->GetTxtFld() ) UpdateField( pFmtFld->GetTxtFld(), aTmpLst ); - } while( aIter++ ); } } // weiter an die Text-Felder, diese "Expandieren" den Text - SwModify::Modify( pOld, pNew ); + NotifyClients( pOld, pNew ); } sal_uInt16 SwRefPageGetFieldType::MakeSetList( _SetGetExpFlds& rTmpLst ) { - SwClientIter aIter( *pDoc->GetSysFldType( RES_REFPAGESETFLD)); - if( aIter.GoStart() ) - do { + SwIterator<SwFmtFld,SwFieldType> aIter(*pDoc->GetSysFldType( RES_REFPAGESETFLD)); + for ( SwFmtFld* pFmtFld = aIter.First(); pFmtFld; pFmtFld = aIter.Next() ) + { // nur die GetRef-Felder Updaten - SwFmtFld* pFmtFld = (SwFmtFld*)aIter(); const SwTxtFld* pTFld = pFmtFld->GetTxtFld(); if( pTFld ) { @@ -2193,7 +2184,7 @@ sal_uInt16 SwRefPageGetFieldType::MakeSetList( _SetGetExpFlds& rTmpLst ) // immer den ersten !! (in Tab-Headline, Kopf-/Fuss ) Point aPt; - const SwCntntFrm* pFrm = rTxtNd.GetFrm( &aPt, 0, sal_False ); + const SwCntntFrm* pFrm = rTxtNd.getLayoutFrm( rTxtNd.GetDoc()->GetCurrentLayout(), &aPt, 0, sal_False ); _SetGetExpFld* pNew; @@ -2225,7 +2216,7 @@ sal_uInt16 SwRefPageGetFieldType::MakeSetList( _SetGetExpFlds& rTmpLst ) if( !rTmpLst.Insert( pNew )) delete pNew; } - } while( aIter++ ); + } return rTmpLst.Count(); } @@ -2256,8 +2247,8 @@ void SwRefPageGetFieldType::UpdateField( SwTxtFld* pTxtFld, { // dann bestimme mal den entsp. Offset Point aPt; - const SwCntntFrm* pFrm = pTxtNode->GetFrm( &aPt, 0, sal_False ); - const SwCntntFrm* pRefFrm = pRefTxtFld->GetTxtNode().GetFrm( &aPt, 0, sal_False ); + const SwCntntFrm* pFrm = pTxtNode->getLayoutFrm( pTxtNode->GetDoc()->GetCurrentLayout(), &aPt, 0, sal_False ); + const SwCntntFrm* pRefFrm = pRefTxtFld->GetTxtNode().getLayoutFrm( pRefTxtFld->GetTxtNode().GetDoc()->GetCurrentLayout(), &aPt, 0, sal_False ); const SwPageFrm* pPgFrm = 0; sal_uInt16 nDiff = ( pFrm && pRefFrm ) ? (pPgFrm = pFrm->FindPageFrm())->GetPhyPageNum() - @@ -2275,7 +2266,7 @@ void SwRefPageGetFieldType::UpdateField( SwTxtFld* pTxtFld, } } // dann die Formatierung anstossen - ((SwFmtFld&)pTxtFld->GetFld()).Modify( 0, 0 ); + ((SwFmtFld&)pTxtFld->GetFld()).ModifyNotification( 0, 0 ); } /*-------------------------------------------------------------------- @@ -2344,7 +2335,7 @@ void SwRefPageGetField::ChangeExpansion( const SwFrm* pFrm, const SwRefPageSetField* pSetFld = (SwRefPageSetField*)pRefTxtFld->GetFld().GetFld(); Point aPt; - const SwCntntFrm* pRefFrm = pRefTxtFld ? pRefTxtFld->GetTxtNode().GetFrm( &aPt, 0, sal_False ) : 0; + const SwCntntFrm* pRefFrm = pRefTxtFld ? pRefTxtFld->GetTxtNode().getLayoutFrm( pFrm->getRootFrm(), &aPt, 0, sal_False ) : 0; if( pSetFld->IsOn() && pRefFrm ) { // dann bestimme mal den entsp. Offset diff --git a/sw/source/core/fields/expfld.cxx b/sw/source/core/fields/expfld.cxx index 495d371967a5..9027ee7bf412 100644 --- a/sw/source/core/fields/expfld.cxx +++ b/sw/source/core/fields/expfld.cxx @@ -64,6 +64,7 @@ #include <SwStyleNameMapper.hxx> #include <unofldmid.h> #include <numrule.hxx> +#include <switerator.hxx> using namespace ::com::sun::star; using namespace ::com::sun::star::text; @@ -285,10 +286,10 @@ SwFieldType* SwGetExpFieldType::Copy() const return new SwGetExpFieldType(GetDoc()); } -void SwGetExpFieldType::Modify( SfxPoolItem*, SfxPoolItem* pNew ) +void SwGetExpFieldType::Modify( const SfxPoolItem*, const SfxPoolItem* pNew ) { if( pNew && RES_DOCPOS_UPDATE == pNew->Which() ) - SwModify::Modify( 0, pNew ); + NotifyClients( 0, pNew ); // sonst nichts weiter expandieren } @@ -503,10 +504,6 @@ bool SwGetExpField::PutValue( const uno::Any& rAny, sal_uInt16 nWhichId ) return true; } -/*------------------------------------------------- - Set-Expression-Type - --------------------------------------------------*/ - SwSetExpFieldType::SwSetExpFieldType( SwDoc* pDc, const String& rName, sal_uInt16 nTyp ) : SwValueFieldType( pDc, RES_SETEXPFLD ), sName( rName ), @@ -534,16 +531,15 @@ const String& SwSetExpFieldType::GetName() const return sName; } -void SwSetExpFieldType::Modify( SfxPoolItem*, SfxPoolItem* ) +void SwSetExpFieldType::Modify( const SfxPoolItem*, const SfxPoolItem* ) { return; // nicht weiter expandieren } void SwSetExpFieldType::SetSeqFormat(sal_uLong nFmt) { - SwClientIter aIter(*this); - for( SwFmtFld* pFld = (SwFmtFld*)aIter.First( TYPE(SwFmtFld) ); - pFld; pFld = (SwFmtFld*)aIter.Next() ) + SwIterator<SwFmtFld,SwFieldType> aIter(*this); + for( SwFmtFld* pFld = aIter.First(); pFld; pFld = aIter.Next() ) pFld->GetFld()->ChangeFormat( nFmt ); } @@ -568,10 +564,9 @@ extern void InsertSort( SvUShorts& rArr, sal_uInt16 nIdx, sal_uInt16* pInsPos = // dann testmal, ob die Nummer schon vergeben ist oder ob eine neue // bestimmt werden muss. - SwClientIter aIter( *this ); + SwIterator<SwFmtFld,SwFieldType> aIter( *this ); const SwTxtNode* pNd; - for( SwFmtFld* pF = (SwFmtFld*)aIter.First( TYPE( SwFmtFld )); pF; - pF = (SwFmtFld*)aIter.Next() ) + for( SwFmtFld* pF = aIter.First(); pF; pF = aIter.Next() ) if( pF->GetFld() != &rFld && pF->GetTxtFld() && 0 != ( pNd = pF->GetTxtFld()->GetpTxtNode() ) && pNd->GetNodes().IsDocNodes() ) @@ -606,10 +601,9 @@ sal_uInt16 SwSetExpFieldType::GetSeqFldList( SwSeqFldList& rList ) if( rList.Count() ) rList.Remove( 0, rList.Count() ); - SwClientIter aIter( *this ); + SwIterator<SwFmtFld,SwFieldType> aIter( *this ); const SwTxtNode* pNd; - for( SwFmtFld* pF = (SwFmtFld*)aIter.First( TYPE( SwFmtFld )); pF; - pF = (SwFmtFld*)aIter.Next() ) + for( SwFmtFld* pF = aIter.First(); pF; pF = aIter.Next() ) if( pF->GetTxtFld() && 0 != ( pNd = pF->GetTxtFld()->GetpTxtNode() ) && pNd->GetNodes().IsDocNodes() ) diff --git a/sw/source/core/fields/fldlst.cxx b/sw/source/core/fields/fldlst.cxx index a7ee49314997..b3be2924760f 100644 --- a/sw/source/core/fields/fldlst.cxx +++ b/sw/source/core/fields/fldlst.cxx @@ -29,7 +29,7 @@ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_sw.hxx" - +#include "switerator.hxx" #include "editsh.hxx" #include "doc.hxx" #include <docary.hxx> @@ -64,10 +64,8 @@ SwInputFieldList::SwInputFieldList( SwEditShell* pShell, sal_Bool bBuildTmpLst ) if( RES_SETEXPFLD == nType || RES_INPUTFLD == nType || RES_DROPDOWN == nType ) { - SwClientIter aIter( *pFldType ); - for( SwFmtFld* pFld = (SwFmtFld*)aIter.First( TYPE(SwFmtFld) ); - pFld; pFld = (SwFmtFld*)aIter.Next() ) - + SwIterator<SwFmtFld,SwFieldType> aIter( *pFldType ); + for( SwFmtFld* pFld = aIter.First(); pFld; pFld = aIter.Next() ) { const SwTxtFld* pTxtFld = pFld->GetTxtFld(); @@ -162,9 +160,8 @@ sal_uInt16 SwInputFieldList::BuildSortLst() if( RES_SETEXPFLD == nType || RES_INPUTFLD == nType ) { - SwClientIter aIter( *pFldType ); - for( SwFmtFld* pFld = (SwFmtFld*)aIter.First( TYPE(SwFmtFld) ); - pFld; pFld = (SwFmtFld*)aIter.Next() ) + SwIterator<SwFmtFld,SwFieldType> aIter( *pFldType ); + for( SwFmtFld* pFld = aIter.First(); pFld; pFld = aIter.Next() ) { const SwTxtFld* pTxtFld = pFld->GetTxtFld(); diff --git a/sw/source/core/fields/postithelper.cxx b/sw/source/core/fields/postithelper.cxx index fb57eebdeef3..81cc0c294713 100644 --- a/sw/source/core/fields/postithelper.cxx +++ b/sw/source/core/fields/postithelper.cxx @@ -48,7 +48,7 @@ #include <redline.hxx> #include <scriptinfo.hxx> #include <editeng/charhiddenitem.hxx> - +#include <switerator.hxx> namespace { @@ -94,9 +94,8 @@ SwPostItHelper::SwLayoutStatus SwPostItHelper::getLayoutInfos( std::vector< SwLa SwCntntNode* pNode = rPos.nNode.GetNode().GetCntntNode(); // getfirstcontentnode // getnext... if( !pNode ) return aRet; - SwClientIter aIter( *pNode ); - SwTxtFrm *pTxtFrm; - for( pTxtFrm = (SwTxtFrm*)aIter.First( TYPE( SwTxtFrm )); pTxtFrm; pTxtFrm = (SwTxtFrm*)aIter.Next() ) + SwIterator<SwTxtFrm,SwCntntNode> aIter( *pNode ); + for( SwTxtFrm* pTxtFrm = aIter.First(); pTxtFrm; pTxtFrm = aIter.Next() ) { if( !pTxtFrm->IsFollow() ) { diff --git a/sw/source/core/fields/reffld.cxx b/sw/source/core/fields/reffld.cxx index 5a1b83fe4e5c..2035ac97fc38 100644 --- a/sw/source/core/fields/reffld.cxx +++ b/sw/source/core/fields/reffld.cxx @@ -58,9 +58,7 @@ #include <flyfrm.hxx> #include <pagedesc.hxx> #include <IMark.hxx> -// --> OD 2007-10-18 #i81002# #include <crossrefbookmark.hxx> -// <-- #include <ftnidx.hxx> #include <viewsh.hxx> #include <unofldmid.h> @@ -71,6 +69,7 @@ #include <comcore.hrc> #include <numrule.hxx> #include <SwNodeNum.hxx> +#include <switerator.hxx> using namespace ::com::sun::star; using namespace ::com::sun::star::text; @@ -106,8 +105,8 @@ void lcl_GetLayTree( const SwFrm* pFrm, SvPtrarr& rArr ) sal_Bool IsFrameBehind( const SwTxtNode& rMyNd, sal_uInt16 nMySttPos, const SwTxtNode& rBehindNd, sal_uInt16 nSttPos ) { - const SwTxtFrm *pMyFrm = (SwTxtFrm*)rMyNd.GetFrm(0,0,sal_False), - *pFrm = (SwTxtFrm*)rBehindNd.GetFrm(0,0,sal_False); + const SwTxtFrm *pMyFrm = (SwTxtFrm*)rMyNd.getLayoutFrm( rMyNd.GetDoc()->GetCurrentLayout(), 0,0,sal_False), + *pFrm = (SwTxtFrm*)rBehindNd.getLayoutFrm( rBehindNd.GetDoc()->GetCurrentLayout(), 0,0,sal_False); while( pFrm && !pFrm->IsInside( nSttPos ) ) pFrm = (SwTxtFrm*)pFrm->GetFollow(); @@ -393,7 +392,7 @@ void SwGetRefField::UpdateField( const SwTxtFld* pFldTxtAttr ) case REF_PAGE: case REF_PAGE_PGDESC: { - const SwTxtFrm* pFrm = (SwTxtFrm*)pTxtNd->GetFrm(0,0,sal_False), + const SwTxtFrm* pFrm = (SwTxtFrm*)pTxtNd->getLayoutFrm( pDoc->GetCurrentLayout(), 0,0,sal_False), *pSave = pFrm; while( pFrm && !pFrm->IsInside( nStt ) ) pFrm = (SwTxtFrm*)pFrm->GetFollow(); @@ -415,7 +414,7 @@ void SwGetRefField::UpdateField( const SwTxtFld* pFldTxtAttr ) case REF_CHAPTER: { // ein bischen trickreich: suche irgend einen Frame - const SwFrm* pFrm = pTxtNd->GetFrm(); + const SwFrm* pFrm = pTxtNd->getLayoutFrm( pDoc->GetCurrentLayout() ); if( pFrm ) { SwChapterFieldType aFldTyp; @@ -756,10 +755,6 @@ void SwGetRefField::ConvertProgrammaticToUIName() } } } -/*-----------------JP: 18.06.93 ------------------- - Get-Referenz-Type - --------------------------------------------------*/ - SwGetRefFieldType::SwGetRefFieldType( SwDoc* pDc ) : SwFieldType( RES_GETREFFLD ), pDoc( pDc ) @@ -772,14 +767,13 @@ SwFieldType* SwGetRefFieldType::Copy() const } -void SwGetRefFieldType::Modify( SfxPoolItem* pOld, SfxPoolItem* pNew ) +void SwGetRefFieldType::Modify( const SfxPoolItem* pOld, const SfxPoolItem* pNew ) { // Update auf alle GetReferenz-Felder if( !pNew && !pOld ) { - SwClientIter aIter( *this ); - for( SwFmtFld* pFld = (SwFmtFld*)aIter.First( TYPE(SwFmtFld) ); - pFld; pFld = (SwFmtFld*)aIter.Next() ) + SwIterator<SwFmtFld,SwFieldType> aIter( *this ); + for( SwFmtFld* pFld = aIter.First(); pFld; pFld = aIter.Next() ) { // nur die GetRef-Felder Updaten //JP 3.4.2001: Task 71231 - we need the correct language @@ -799,7 +793,7 @@ void SwGetRefFieldType::Modify( SfxPoolItem* pOld, SfxPoolItem* pNew ) } } // weiter an die Text-Felder, diese "Expandieren" den Text - SwModify::Modify( pOld, pNew ); + NotifyClients( pOld, pNew ); } SwTxtNode* SwGetRefFieldType::FindAnchor( SwDoc* pDoc, const String& rRefMark, @@ -830,9 +824,8 @@ SwTxtNode* SwGetRefFieldType::FindAnchor( SwDoc* pDoc, const String& rRefMark, if( pFldType && pFldType->GetDepends() && nsSwGetSetExpType::GSE_SEQ & ((SwSetExpFieldType*)pFldType)->GetType() ) { - SwClientIter aIter( *pFldType ); - for( SwFmtFld* pFld = (SwFmtFld*)aIter.First( TYPE(SwFmtFld) ); - pFld; pFld = (SwFmtFld*)aIter.Next() ) + SwIterator<SwFmtFld,SwFieldType> aIter( *pFldType ); + for( SwFmtFld* pFld = aIter.First(); pFld; pFld = aIter.Next() ) { if( pFld->GetTxtFld() && nSeqNo == ((SwSetExpField*)pFld->GetFld())->GetSeqNumber() ) @@ -943,22 +936,20 @@ void _RefIdsMap::Check( SwDoc& rDoc, SwDoc& rDestDoc, SwGetRefField& rFld, if( bField ) { const SwTxtNode* pNd; - SwModify* pMod; - if( 0 != ( pMod = rDestDoc.GetFldType( RES_SETEXPFLD, aName, false ) )) + SwFieldType* pType; + if( 0 != ( pType = rDestDoc.GetFldType( RES_SETEXPFLD, aName, false ) )) { - SwClientIter aIter( *pMod ); - for( SwFmtFld* pF = (SwFmtFld*)aIter.First( TYPE( SwFmtFld )); pF; - pF = (SwFmtFld*)aIter.Next() ) + SwIterator<SwFmtFld,SwFieldType> aIter( *pType ); + for( SwFmtFld* pF = aIter.First(); pF; pF = aIter.Next() ) if( pF->GetTxtFld() && 0 != ( pNd = pF->GetTxtFld()->GetpTxtNode() ) && pNd->GetNodes().IsDocNodes() ) aIds.Insert( ((SwSetExpField*)pF->GetFld())->GetSeqNumber() ); } - if( 0 != ( pMod = rDoc.GetFldType( RES_SETEXPFLD, aName, false ) )) + if( 0 != ( pType = rDoc.GetFldType( RES_SETEXPFLD, aName, false ) )) { - SwClientIter aIter( *pMod ); - for( SwFmtFld* pF = (SwFmtFld*)aIter.First( TYPE( SwFmtFld )); pF; - pF = (SwFmtFld*)aIter.Next() ) + SwIterator<SwFmtFld,SwFieldType> aIter( *pType ); + for( SwFmtFld* pF = aIter.First(); pF; pF = aIter.Next() ) if( pF->GetTxtFld() && 0 != ( pNd = pF->GetTxtFld()->GetpTxtNode() ) && pNd->GetNodes().IsDocNodes() ) @@ -1004,12 +995,11 @@ void _RefIdsMap::Check( SwDoc& rDoc, SwDoc& rDestDoc, SwGetRefField& rFld, // Id umsetzen if( bField ) { - SwModify* pMod = rDoc.GetFldType( RES_SETEXPFLD, aName, false ); - if( pMod ) + SwFieldType* pType = rDoc.GetFldType( RES_SETEXPFLD, aName, false ); + if( pType ) { - SwClientIter aIter( *pMod ); - for( SwFmtFld* pF = (SwFmtFld*)aIter.First( TYPE( SwFmtFld )); pF; - pF = (SwFmtFld*)aIter.Next() ) + SwIterator<SwFmtFld,SwFieldType> aIter( *pType ); + for( SwFmtFld* pF = aIter.First(); pF; pF = aIter.Next() ) if( pF->GetTxtFld() && nSeqNo == ((SwSetExpField*)pF->GetFld())->GetSeqNumber() ) ((SwSetExpField*)pF->GetFld())->SetSeqNumber( n ); @@ -1047,11 +1037,10 @@ void SwGetRefFieldType::MergeWithOtherDoc( SwDoc& rDestDoc ) _RefIdsMap aFntMap( aEmptyStr ); _RefIdsMaps aFldMap; - SwClientIter aIter( *this ); - for( SwClient* pFld = aIter.First( TYPE( SwFmtFld )); - pFld; pFld = aIter.Next() ) + SwIterator<SwFmtFld,SwFieldType> aIter( *this ); + for( SwFmtFld* pFld = aIter.First(); pFld; pFld = aIter.Next() ) { - SwGetRefField& rRefFld = *(SwGetRefField*)((SwFmtFld*)pFld)->GetFld(); + SwGetRefField& rRefFld = *(SwGetRefField*)pFld->GetFld(); switch( rRefFld.GetSubType() ) { case REF_SEQUENCEFLD: diff --git a/sw/source/core/fields/tblcalc.cxx b/sw/source/core/fields/tblcalc.cxx index c3f081a3f2dd..451c963f39ee 100644 --- a/sw/source/core/fields/tblcalc.cxx +++ b/sw/source/core/fields/tblcalc.cxx @@ -29,7 +29,7 @@ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_sw.hxx" - +#include <switerator.hxx> #include <cntfrm.hxx> #include <doc.hxx> #include <pam.hxx> // fuer GetBodyTxtNode @@ -40,7 +40,6 @@ #include <docfld.hxx> // fuer _SetGetExpFld #include <unofldmid.h> - using namespace ::com::sun::star; using ::rtl::OUString; @@ -105,15 +104,10 @@ const SwNode* SwTblField::GetNodeOfFormula() const if( !GetTyp()->GetDepends() ) return 0; - SwClientIter aIter( *GetTyp() ); - SwClient * pLast = aIter.GoStart(); - if( pLast ) // konnte zum Anfang gesprungen werden ?? - do { - const SwFmtFld* pFmtFld = (SwFmtFld*)pLast; + SwIterator<SwFmtFld,SwFieldType> aIter( *GetTyp() ); + for( SwFmtFld* pFmtFld = aIter.First(); pFmtFld; pFmtFld = aIter.Next() ) if( this == pFmtFld->GetFld() ) return (SwTxtNode*)&pFmtFld->GetTxtFld()->GetTxtNode(); - - } while( 0 != ( pLast = aIter++ )); return 0; } diff --git a/sw/source/core/fields/usrfld.cxx b/sw/source/core/fields/usrfld.cxx index 8909f588f842..e5ba807f44fa 100644 --- a/sw/source/core/fields/usrfld.cxx +++ b/sw/source/core/fields/usrfld.cxx @@ -228,12 +228,12 @@ const String& SwUserFieldType::GetName() const return aName; } -void SwUserFieldType::Modify( SfxPoolItem* pOld, SfxPoolItem* pNew ) +void SwUserFieldType::Modify( const SfxPoolItem* pOld, const SfxPoolItem* pNew ) { if( !pOld && !pNew ) ChgValid( sal_False ); - SwModify::Modify( pOld, pNew ); + NotifyClients( pOld, pNew ); // und ggfs. am UserFeld haengende InputFelder updaten! GetDoc()->GetSysFldType( RES_INPUTFLD )->UpdateFlds(); } diff --git a/sw/source/core/frmedt/fecopy.cxx b/sw/source/core/frmedt/fecopy.cxx index f2a53816c0fe..8662286726de 100644 --- a/sw/source/core/frmedt/fecopy.cxx +++ b/sw/source/core/frmedt/fecopy.cxx @@ -262,7 +262,7 @@ sal_Bool lcl_SetAnchor( const SwPosition& rPos, const SwNode& rNd, SwFlyFrm* pFl { sal_Bool bRet = sal_True; rAnchor.SetAnchor( &rPos ); - SwCntntFrm* pTmpFrm = rNd.GetCntntNode()->GetFrm( &rInsPt, 0, sal_False ); + SwCntntFrm* pTmpFrm = rNd.GetCntntNode()->getLayoutFrm( rDestShell.GetLayout(), &rInsPt, 0, sal_False ); SwFlyFrm *pTmpFly = pTmpFrm->FindFlyFrm(); if( pTmpFly && bCheckFlyRecur && pFly->IsUpperOf( *pTmpFly ) ) { diff --git a/sw/source/core/frmedt/fedesc.cxx b/sw/source/core/frmedt/fedesc.cxx index 11ea45c3cdea..28becd7069d7 100644 --- a/sw/source/core/frmedt/fedesc.cxx +++ b/sw/source/core/frmedt/fedesc.cxx @@ -229,14 +229,14 @@ const SwPageDesc* SwFEShell::GetSelectedPageDescs() const FOREACHPAM_START(this) if( 0 != (pCNd = PCURCRSR->GetCntntNode() ) && - 0 != ( pPtFrm = pCNd->GetFrm( &aNulPt, 0, sal_False )) ) + 0 != ( pPtFrm = pCNd->getLayoutFrm( GetLayout(), &aNulPt, 0, sal_False )) ) pPtFrm = pPtFrm->FindPageFrm(); else pPtFrm = 0; if( PCURCRSR->HasMark() && 0 != (pCNd = PCURCRSR->GetCntntNode( sal_False ) ) && - 0 != ( pMkFrm = pCNd->GetFrm( &aNulPt, 0, sal_False )) ) + 0 != ( pMkFrm = pCNd->getLayoutFrm( GetLayout(), &aNulPt, 0, sal_False )) ) pMkFrm = pMkFrm->FindPageFrm(); else pMkFrm = pPtFrm; diff --git a/sw/source/core/frmedt/fefly1.cxx b/sw/source/core/frmedt/fefly1.cxx index 1a504d038f03..0661ae227dbc 100644 --- a/sw/source/core/frmedt/fefly1.cxx +++ b/sw/source/core/frmedt/fefly1.cxx @@ -108,7 +108,7 @@ sal_Bool lcl_SetNewFlyPos( const SwNode& rNode, SwFmtAnchor& rAnchor, else { const SwCntntNode *pCntNd = rNode.GetCntntNode(); - const SwCntntFrm* pCFrm = pCntNd ? pCntNd->GetFrm( &rPt, 0, sal_False ) : 0; + const SwCntntFrm* pCFrm = pCntNd ? pCntNd->getLayoutFrm( pCntNd->GetDoc()->GetCurrentLayout(), &rPt, 0, sal_False ) : 0; const SwPageFrm *pPg = pCFrm ? pCFrm->FindPageFrm() : 0; rAnchor.SetPageNum( pPg ? pPg->GetPhyPageNum() : 1 ); @@ -171,9 +171,9 @@ sal_Bool lcl_FindAnchorPos( SwDoc& rDoc, const Point& rPt, const SwFrm& rFrm, SwCrsrMoveState aState( MV_SETONLYTEXT ); SwPosition aPos( rDoc.GetNodes() ); aTmpPnt.X() -= 1; //nicht im Fly landen!! - rDoc.GetRootFrm()->GetCrsrOfst( &aPos, aTmpPnt, &aState ); + rDoc.GetCurrentLayout()->GetCrsrOfst( &aPos, aTmpPnt, &aState ); //swmod 071108//swmod 071225 pNewAnch = ::FindAnchor( - aPos.nNode.GetNode().GetCntntNode()->GetFrm( 0, 0, sal_False ), + aPos.nNode.GetNode().GetCntntNode()->getLayoutFrm( rFrm.getRootFrm(), 0, 0, sal_False ), aTmpPnt )->FindFlyFrm(); if( pNewAnch && &rFrm != pNewAnch && !pNewAnch->IsProtected() ) @@ -281,7 +281,7 @@ SwFlyFrm *SwFEShell::FindFlyFrm() const return 0; SdrObject *pO = rMrkList.GetMark( 0 )->GetMarkedSdrObj(); - return pO->ISA(SwVirtFlyDrawObj) ? ((SwVirtFlyDrawObj*)pO)->GetFlyFrm() : 0; + return ( pO && pO->ISA(SwVirtFlyDrawObj) ) ? ((SwVirtFlyDrawObj*)pO)->GetFlyFrm() : 0; } return 0; } @@ -341,7 +341,7 @@ const SwFrmFmt* SwFEShell::IsFlyInFly() aPoint.X() -= 1; //nicht im Fly landen!! GetLayout()->GetCrsrOfst( &aPos, aPoint, &aState ); // determine text frame by left-top-corner of object - pTxtFrm = aPos.nNode.GetNode().GetCntntNode()->GetFrm( &aTmpPos, 0, sal_False ); + pTxtFrm = aPos.nNode.GetNode().GetCntntNode()->getLayoutFrm( GetLayout(), &aTmpPos, 0, sal_False ); } const SwFrm *pTmp = ::FindAnchor( pTxtFrm, aTmpPos ); const SwFlyFrm *pFly = pTmp->FindFlyFrm(); @@ -462,7 +462,7 @@ Point SwFEShell::FindAnchorPos( const Point& rAbsPos, sal_Bool bMoveIt ) SwPosition aPos( GetDoc()->GetNodes().GetEndOfExtras() ); Point aTmpPnt( rAbsPos ); GetLayout()->GetCrsrOfst( &aPos, aTmpPnt, &aState ); - pTxtFrm = aPos.nNode.GetNode().GetCntntNode()->GetFrm(0,&aPos,sal_False ); + pTxtFrm = aPos.nNode.GetNode().GetCntntNode()->getLayoutFrm( GetLayout(),0,&aPos,sal_False ); } const SwFrm *pNewAnch; if( pTxtFrm ) @@ -905,8 +905,8 @@ void SwFEShell::InsertDrawObj( SdrObject& rDrawObj, { SwCrsrMoveState aState( MV_SETONLYTEXT ); Point aTmpPt( rInsertPosition ); - getIDocumentLayoutAccess()->GetRootFrm()->GetCrsrOfst( aPam.GetPoint(), aTmpPt, &aState ); - const SwFrm* pFrm = aPam.GetCntntNode()->GetFrm( 0, 0, sal_False ); + GetLayout()->GetCrsrOfst( aPam.GetPoint(), aTmpPt, &aState ); + const SwFrm* pFrm = aPam.GetCntntNode()->getLayoutFrm( GetLayout(), 0, 0, sal_False ); const Point aRelPos( rInsertPosition.X() - pFrm->Frm().Left(), rInsertPosition.Y() - pFrm->Frm().Top() ); rDrawObj.SetRelativePos( aRelPos ); @@ -970,7 +970,7 @@ void SwFEShell::SetPageObjsNewPage( SvPtrarr& rFillArr, int nOffset ) SwFrmFmt* pFmt; long nNewPage; - SwRootFrm* pTmpRootFrm = getIDocumentLayoutAccess()->GetRootFrm(); + SwRootFrm* pTmpRootFrm = GetLayout();//swmod 080317 sal_uInt16 nMaxPage = pTmpRootFrm->GetPageNum(); sal_Bool bTmpAssert = sal_False; for( sal_uInt16 n = 0; n < rFillArr.Count(); ++n ) @@ -1709,7 +1709,7 @@ const SwFrmFmt* SwFEShell::GetFmtFromAnyObj( const Point& rPt ) const Point aPt( rPt ); GetLayout()->GetCrsrOfst( &aPos, aPt ); SwCntntNode *pNd = aPos.nNode.GetNode().GetCntntNode(); - SwFrm* pFrm = pNd->GetFrm( &rPt )->FindFlyFrm(); + SwFrm* pFrm = pNd->getLayoutFrm( GetLayout(), &rPt, 0, sal_False )->FindFlyFrm(); pRet = pFrm ? ((SwLayoutFrm*)pFrm)->GetFmt() : 0; } return pRet; @@ -1826,6 +1826,8 @@ ObjCntType SwFEShell::GetObjCntTypeOfSelection( SdrObject** ppObj ) const for( sal_uInt32 i = 0, nE = rMrkList.GetMarkCount(); i < nE; ++i ) { SdrObject* pObj = rMrkList.GetMark( i )->GetMarkedSdrObj(); + if( !pObj ) + continue; ObjCntType eTmp = GetObjCntType( *pObj ); if( !i ) { diff --git a/sw/source/core/frmedt/feflyole.cxx b/sw/source/core/frmedt/feflyole.cxx index 43df3c04d3a4..2de80477cd85 100644 --- a/sw/source/core/frmedt/feflyole.cxx +++ b/sw/source/core/frmedt/feflyole.cxx @@ -79,7 +79,7 @@ SwFlyFrm *SwFEShell::FindFlyFrm( const uno::Reference < embed::XEmbeddedObject > ((SwOLENode*)pNd)->GetOLEObj().GetOleRef() == xObj ) { bExist = sal_True; - SwFrm *pFrm = ((SwOLENode*)pNd)->GetFrm(); + SwFrm *pFrm = ((SwOLENode*)pNd)->getLayoutFrm( GetLayout() ); if ( pFrm ) pFly = pFrm->FindFlyFrm(); break; diff --git a/sw/source/core/frmedt/feshview.cxx b/sw/source/core/frmedt/feshview.cxx index 20edc3ecbcac..693fe638532a 100644 --- a/sw/source/core/frmedt/feshview.cxx +++ b/sw/source/core/frmedt/feshview.cxx @@ -50,7 +50,6 @@ #include <editeng/protitem.hxx> #include <svx/svdpage.hxx> #include <svx/svdpagv.hxx> - #include <IDocumentSettingAccess.hxx> #include <cmdid.h> #include <poolfmt.hrc> // fuer InitFldTypes @@ -88,9 +87,10 @@ #include "txtfrm.hxx" #include "txatbase.hxx" #include "mdiexp.hxx" // fuer Update der Statuszeile bei drag -#include <sortedobjs.hxx> // #i28701# +#include <sortedobjs.hxx> #include <HandleAnchorNodeChg.hxx> #include <basegfx/polygon/b2dpolygon.hxx> +#include <switerator.hxx> #define SCROLLVAL 75 @@ -107,7 +107,7 @@ SwFlyFrm *GetFlyFromMarked( const SdrMarkList *pLst, ViewShell *pSh ) if ( pLst && pLst->GetMarkCount() == 1 ) { SdrObject *pO = pLst->GetMark( 0 )->GetMarkedSdrObj(); - if ( pO->ISA(SwVirtFlyDrawObj) ) + if ( pO && pO->ISA(SwVirtFlyDrawObj) ) return ((SwVirtFlyDrawObj*)pO)->GetFlyFrm(); } return 0; @@ -141,7 +141,6 @@ extern sal_Bool bNoInterrupt; // in swapp.cxx /************************************************************************* |* |* SwFEShell::SelectObj() -|* *************************************************************************/ sal_Bool SwFEShell::SelectObj( const Point& rPt, sal_uInt8 nFlag, SdrObject *pObj ) @@ -589,7 +588,7 @@ bool SwFEShell::IsSelContainsControl() const // if we have one marked object, get the SdrObject and check // whether it contains a control const SdrObject* pSdrObject = pMarkList->GetMark( 0 )->GetMarkedSdrObj(); - bRet = ::CheckControlLayer( pSdrObject ); + bRet = pSdrObject && ::CheckControlLayer( pSdrObject ); } return bRet; } @@ -692,7 +691,7 @@ long SwFEShell::EndDrag( const Point *, sal_Bool ) //pView->ShowShownXor( GetOut() ); pView->EndDragObj(); - // JP 18.08.95: DrawUndo-Action auf FlyFrames werden nicht gespeichert + // DrawUndo-Action auf FlyFrames werden nicht gespeichert // Die Fly aendern das Flag GetDoc()->GetIDocumentUndoRedo().DoDrawUndo(true); ChgAnchor( 0, sal_True ); @@ -732,7 +731,6 @@ void SwFEShell::BreakDrag() |* |* Beschreibung Wenn ein Fly selektiert ist, zieht er den Crsr in |* den ersten CntntFrm -|* *************************************************************************/ const SwFrmFmt* SwFEShell::SelFlyGrabCrsr() @@ -904,7 +902,6 @@ void SwFEShell::SelectionToBottom( sal_Bool bBottom ) |* |* Beschreibung Objekt ueber/unter dem Dokument? |* 2 Controls, 1 Heaven, 0 Hell, -1 Uneindeutig -|* *************************************************************************/ short SwFEShell::GetLayerId() const @@ -916,6 +913,8 @@ short SwFEShell::GetLayerId() const for ( sal_uInt16 i = 0; i < rMrkList.GetMarkCount(); ++i ) { const SdrObject *pObj = rMrkList.GetMark( i )->GetMarkedSdrObj(); + if( !pObj ) + continue; if ( nRet == SHRT_MAX ) nRet = pObj->GetLayer(); else if ( nRet != pObj->GetLayer() ) @@ -950,7 +949,8 @@ void SwFEShell::ChangeOpaque( SdrLayerID nLayerId ) for ( sal_uInt16 i = 0; i < rMrkList.GetMarkCount(); ++i ) { SdrObject* pObj = rMrkList.GetMark( i )->GetMarkedSdrObj(); - // #i18447# - no change of layer for controls + if( !pObj ) + continue; // or group objects containing controls. // --> #i113730# // consider that a member of a drawing group has been selected. @@ -1544,7 +1544,7 @@ void SwFEShell::MoveCreate( const Point &rPos ) sal_Bool SwFEShell::EndCreate( sal_uInt16 eSdrCreateCmd ) { - // JP 18.08.95: Damit das Undo-Object aus der DrawEngine nicht bei uns + // Damit das Undo-Object aus der DrawEngine nicht bei uns // gespeichert wird, (wir erzeugen ein eigenes Undo-Object!) hier kurz // das Undo abschalten OSL_ENSURE( Imp()->HasDrawView(), "EndCreate without DrawView?" ); @@ -1580,7 +1580,7 @@ sal_Bool SwFEShell::ImpEndCreate() if( rSdrObj.GetSnapRect().IsEmpty() ) { - //JP 10.04.95: das Object vergessen wir lieber, fuerht nur + // das Object vergessen wir lieber, fuerht nur // zu Problemen Imp()->GetDrawView()->DeleteMarked(); Imp()->GetDrawView()->UnmarkAll(); @@ -1622,12 +1622,12 @@ sal_Bool SwFEShell::ImpEndCreate() SwPosition aPos( GetDoc()->GetNodes() ); SwCrsrMoveState aState( MV_SETONLYTEXT ); Point aPoint( aPt.X(), aPt.Y() + rBound.GetHeight()/2 ); - getIDocumentLayoutAccess()->GetRootFrm()->GetCrsrOfst( &aPos, aPoint, &aState ); + GetLayout()->GetCrsrOfst( &aPos, aPoint, &aState ); //swmod 080317 - //JP 22.01.99: Zeichenbindung ist im ReadnOnly-Inhalt nicht erlaubt + //Zeichenbindung ist im ReadnOnly-Inhalt nicht erlaubt if( !aPos.nNode.GetNode().IsProtect() ) { - pAnch = aPos.nNode.GetNode().GetCntntNode()->GetFrm( &aPoint, &aPos ); + pAnch = aPos.nNode.GetNode().GetCntntNode()->getLayoutFrm( GetLayout(), &aPoint, &aPos ); SwRect aTmp; pAnch->GetCharRect( aTmp, aPos ); @@ -1669,13 +1669,13 @@ sal_Bool SwFEShell::ImpEndCreate() SwPosition aPos( GetDoc()->GetNodes() ); GetLayout()->GetCrsrOfst( &aPos, aPoint, &aState ); - //JP 22.01.99: nicht in ReadnOnly-Inhalt setzen + //nicht in ReadnOnly-Inhalt setzen if( aPos.nNode.GetNode().IsProtect() ) // dann darf er nur seitengebunden sein. Oder sollte man // die naechste nicht READONLY Position suchen? bAtPage = true; - pAnch = aPos.nNode.GetNode().GetCntntNode()->GetFrm( &aPoint, 0, sal_False ); + pAnch = aPos.nNode.GetNode().GetCntntNode()->getLayoutFrm( GetLayout(), &aPoint, 0, sal_False ); if( !bAtPage ) { @@ -1708,7 +1708,7 @@ sal_Bool SwFEShell::ImpEndCreate() pAnch = ::FindAnchor( pPage, aPt, bBodyOnly ); aPos.nNode = *((SwCntntFrm*)pAnch)->GetNode(); - //JP 22.01.99: nicht in ReadnOnly-Inhalt setzen + //nicht in ReadnOnly-Inhalt setzen if( aPos.nNode.GetNode().IsProtect() ) // dann darf er nur seitengebunden sein. Oder sollte man // die naechste nicht READONLY Position suchen? @@ -2385,14 +2385,12 @@ sal_Bool SwFEShell::GotoFly( const String& rName, FlyCntType eType, sal_Bool bSe { SET_CURR_SHELL( this ); - SwClientIter aIter( *(SwModify*)pFlyFmt ); - SwFlyFrm* pFrm = (SwFlyFrm*)aIter.First( TYPE( SwFlyFrm )); + SwFlyFrm* pFrm = SwIterator<SwFlyFrm,SwFmt>::FirstElement( *pFlyFmt ); if( pFrm ) { - OSL_ENSURE( pFrm->IsFlyFrm(), "Wrong FrmType" ); if( bSelFrm ) { - SelectObj( pFrm->Frm().Pos(), 0, ((SwFlyFrm*)pFrm)->GetVirtDrawObj() ); + SelectObj( pFrm->Frm().Pos(), 0, pFrm->GetVirtDrawObj() ); if( !ActionPend() ) MakeVisible( pFrm->Frm() ); } @@ -2798,25 +2796,17 @@ long SwFEShell::GetSectionWidth( SwFmt& rFmt ) const do { // Ist es der Gewuenschte? - if( pSect->GetRegisteredIn() == &rFmt ) + if( pSect->KnowsFormat( rFmt ) ) return pSect->Frm().Width(); // fuer geschachtelte Bereiche pSect = pSect->GetUpper()->FindSctFrm(); } while( pSect ); } - SwClientIter aIter( rFmt ); - SwClient *pLast = aIter.GoStart(); - while ( pLast ) - { - if ( pLast->IsA( TYPE(SwFrm) ) ) - { - SwSectionFrm* pSct = (SwSectionFrm*)pLast; + SwIterator<SwSectionFrm,SwFmt> aIter( rFmt ); + for ( SwSectionFrm* pSct = aIter.First(); pFrm; pFrm = aIter.Next() ) if( !pSct->IsFollow() ) return pSct->Frm().Width(); - } - pLast = aIter++; - } return 0; } diff --git a/sw/source/core/frmedt/fetab.cxx b/sw/source/core/frmedt/fetab.cxx index 6f90a7b74987..5f7b19bef5e2 100644 --- a/sw/source/core/frmedt/fetab.cxx +++ b/sw/source/core/frmedt/fetab.cxx @@ -1122,7 +1122,7 @@ sal_uInt16 lcl_GetRowNumber( const SwPosition& rPos ) const SwCntntFrm *pFrm; if( 0 != ( pNd = rPos.nNode.GetNode().GetCntntNode() )) - pFrm = pNd->GetFrm( &aTmpPt, &rPos, sal_False ); + pFrm = pNd->getLayoutFrm( pNd->GetDoc()->GetCurrentLayout(), &aTmpPt, &rPos, sal_False ); else pFrm = 0; diff --git a/sw/source/core/frmedt/fews.cxx b/sw/source/core/frmedt/fews.cxx index 787990831e75..d88e6e1b89bd 100644 --- a/sw/source/core/frmedt/fews.cxx +++ b/sw/source/core/frmedt/fews.cxx @@ -115,10 +115,17 @@ const SwRect& SwFEShell::GetAnyCurRect( CurRectType eType, const Point* pPt, Point aPt( *pPt ); GetLayout()->GetCrsrOfst( &aPos, aPt ); SwCntntNode *pNd = aPos.nNode.GetNode().GetCntntNode(); - pFrm = pNd->GetFrm( pPt ); + pFrm = pNd->getLayoutFrm( GetLayout(), pPt ); } else + { + const bool bOldCallbackActionEnabled = GetLayout()->IsCallbackActionEnabled(); + if( bOldCallbackActionEnabled ) + GetLayout()->SetCallbackActionEnabled( sal_False ); pFrm = GetCurrFrm(); + if( bOldCallbackActionEnabled ) + GetLayout()->SetCallbackActionEnabled( sal_True ); + } } if( !pFrm ) @@ -252,7 +259,7 @@ sal_uInt16 SwFEShell::GetFrmType( const Point *pPt, sal_Bool bStopAtFly ) const Point aPt( *pPt ); GetLayout()->GetCrsrOfst( &aPos, aPt ); SwCntntNode *pNd = aPos.nNode.GetNode().GetCntntNode(); - pFrm = pNd->GetFrm( pPt ); + pFrm = pNd->getLayoutFrm( GetLayout(), pPt ); } else pFrm = GetCurrFrm( sal_False ); @@ -401,7 +408,7 @@ void SwFEShell::SetNewPageOffset( sal_uInt16 nOffset ) void SwFEShell::SetPageOffset( sal_uInt16 nOffset ) { const SwPageFrm *pPage = GetCurrFrm( sal_False )->FindPageFrm(); - const SwRootFrm* pLayout = GetLayout(); + const SwRootFrm* pDocLayout = GetLayout(); while ( pPage ) { const SwFrm *pFlow = pPage->FindFirstBodyCntnt(); @@ -412,7 +419,7 @@ void SwFEShell::SetPageOffset( sal_uInt16 nOffset ) const SwFmtPageDesc& rPgDesc = pFlow->GetAttrSet()->GetPageDesc(); if ( rPgDesc.GetNumOffset() ) { - pLayout->SetVirtPageNum( sal_True ); + pDocLayout->SetVirtPageNum( sal_True ); lcl_SetAPageOffset( nOffset, (SwPageFrm*)pPage, this ); break; } @@ -495,6 +502,7 @@ void SwFEShell::InsertLabel( const SwLabelType eType, const String &rTxt, const for ( sal_uInt16 i = 0; i < rMrkList.GetMarkCount(); ++i ) { SdrObject* pDrawObj = rMrkList.GetMark(i)->GetMarkedSdrObj(); + if( pDrawObj ) aDrawObjs.push_back( pDrawObj ); } } diff --git a/sw/source/core/frmedt/tblsel.cxx b/sw/source/core/frmedt/tblsel.cxx index 46d6f23ebcc9..7de8f0727ee1 100644 --- a/sw/source/core/frmedt/tblsel.cxx +++ b/sw/source/core/frmedt/tblsel.cxx @@ -55,9 +55,9 @@ #include <swtblfmt.hxx> #include <UndoTable.hxx> #include <mvsave.hxx> -// OD 26.08.2003 #i18103# #include <sectfrm.hxx> #include <frmtool.hxx> +#include <switerator.hxx> #include <deque> //siehe auch swtable.cxx @@ -197,7 +197,7 @@ void GetTblSelCrs( const SwTableCursor& rTblCrsr, SwSelBoxes& rBoxes ) if( rTblCrsr.IsChgd() || !rTblCrsr.GetBoxesCount() ) { SwTableCursor* pTCrsr = (SwTableCursor*)&rTblCrsr; - pTCrsr->GetDoc()->GetRootFrm()->MakeTblCrsrs( *pTCrsr ); + pTCrsr->GetDoc()->GetCurrentLayout()->MakeTblCrsrs( *pTCrsr ); //swmod 080218 } if( rTblCrsr.GetBoxesCount() ) @@ -292,10 +292,10 @@ void GetTblSel( const SwCursor& rCrsr, SwSelBoxes& rBoxes, } const SwCntntNode *pCntNd = rCrsr.GetCntntNode(); const SwLayoutFrm *pStart = pCntNd ? - pCntNd->GetFrm( &aPtPos )->GetUpper() : 0; + pCntNd->getLayoutFrm( pCntNd->GetDoc()->GetCurrentLayout(), &aPtPos )->GetUpper() : 0; pCntNd = rCrsr.GetCntntNode(sal_False); const SwLayoutFrm *pEnd = pCntNd ? - pCntNd->GetFrm( &aMkPos )->GetUpper() : 0; + pCntNd->getLayoutFrm( pCntNd->GetDoc()->GetCurrentLayout(), &aMkPos )->GetUpper() : 0; if( pStart && pEnd ) GetTblSel( pStart, pEnd, rBoxes, 0, eSearchType ); } @@ -502,10 +502,10 @@ sal_Bool ChkChartSel( const SwNode& rSttNd, const SwNode& rEndNd, // #i22135# - Also the content of the table could be // invisible - e.g. in a hidden section // Robust: check, if content was found (e.g. empty table cells) - if ( !pCNd || pCNd->GetFrm() == NULL ) + if ( !pCNd || pCNd->getLayoutFrm( pCNd->GetDoc()->GetCurrentLayout() ) == NULL ) return sal_False; - const SwLayoutFrm *pStart = pCNd ? pCNd->GetFrm( &aNullPos )->GetUpper() : 0; + const SwLayoutFrm *pStart = pCNd ? pCNd->getLayoutFrm( pCNd->GetDoc()->GetCurrentLayout(), &aNullPos )->GetUpper() : 0; OSL_ENSURE( pStart, "ohne Frame geht gar nichts" ); aIdx = rEndNd; @@ -514,12 +514,12 @@ sal_Bool ChkChartSel( const SwNode& rSttNd, const SwNode& rEndNd, pCNd = aIdx.GetNodes().GoNextSection( &aIdx, sal_False, sal_False ); // #i22135# - Robust: check, if content was found and if it's visible - if ( !pCNd || pCNd->GetFrm() == NULL ) + if ( !pCNd || pCNd->getLayoutFrm( pCNd->GetDoc()->GetCurrentLayout() ) == NULL ) { return sal_False; } - const SwLayoutFrm *pEnd = pCNd ? pCNd->GetFrm( &aNullPos )->GetUpper() : 0; + const SwLayoutFrm *pEnd = pCNd ? pCNd->getLayoutFrm( pCNd->GetDoc()->GetCurrentLayout(), &aNullPos )->GetUpper() : 0; OSL_ENSURE( pEnd, "ohne Frame geht gar nichts" ); @@ -774,9 +774,9 @@ sal_Bool GetAutoSumSel( const SwCrsrShell& rShell, SwCellFrms& rBoxes ) if ( rShell.IsTableMode() ) pCrsr = rShell.pTblCrsr; - const SwLayoutFrm *pStart = pCrsr->GetCntntNode()->GetFrm( + const SwLayoutFrm *pStart = pCrsr->GetCntntNode()->getLayoutFrm( rShell.GetLayout(), &pCrsr->GetPtPos() )->GetUpper(), - *pEnd = pCrsr->GetCntntNode(sal_False)->GetFrm( + *pEnd = pCrsr->GetCntntNode(sal_False)->getLayoutFrm( rShell.GetLayout(), &pCrsr->GetMkPos() )->GetUpper(); const SwLayoutFrm* pSttCell = pStart; @@ -1013,9 +1013,12 @@ void GetMergeSel( const SwPaM& rPam, SwSelBoxes& rBoxes, // richtig. Warum nicht Point 0,0 benutzen? Dann ist garantiert, // das die 1. Headline mit drin ist. Point aPt( 0, 0 ); - const SwLayoutFrm *pStart = rPam.GetCntntNode()->GetFrm( - &aPt )->GetUpper(), - *pEnd = rPam.GetCntntNode(sal_False)->GetFrm( + + const SwCntntNode* pCntNd = rPam.GetCntntNode(); + const SwLayoutFrm *pStart = pCntNd->getLayoutFrm( pCntNd->GetDoc()->GetCurrentLayout(), + &aPt )->GetUpper(); + pCntNd = rPam.GetCntntNode(sal_False); + const SwLayoutFrm *pEnd = pCntNd->getLayoutFrm( pCntNd->GetDoc()->GetCurrentLayout(), &aPt )->GetUpper(); SwSelUnions aUnions; @@ -1529,9 +1532,11 @@ sal_uInt16 CheckMergeSel( const SwPaM& rPam ) // richtig. Warum nicht Point 0,0 benutzen? Dann ist garantiert, // das die 1. Headline mit drin ist. Point aPt; - const SwLayoutFrm *pStart = rPam.GetCntntNode()->GetFrm( - &aPt )->GetUpper(), - *pEnd = rPam.GetCntntNode(sal_False)->GetFrm( + const SwCntntNode* pCntNd = rPam.GetCntntNode(); + const SwLayoutFrm *pStart = pCntNd->getLayoutFrm( pCntNd->GetDoc()->GetCurrentLayout(), + &aPt )->GetUpper(); + pCntNd = rPam.GetCntntNode(sal_False); + const SwLayoutFrm *pEnd = pCntNd->getLayoutFrm( pCntNd->GetDoc()->GetCurrentLayout(), &aPt )->GetUpper(); GetTblSel( pStart, pEnd, aBoxes, 0 ); return CheckMergeSel( aBoxes ); @@ -2058,9 +2063,12 @@ sal_Bool CheckSplitCells( const SwCursor& rCrsr, sal_uInt16 nDiv, aPtPos = pShCrsr->GetPtPos(); aMkPos = pShCrsr->GetMkPos(); } - const SwLayoutFrm *pStart = rCrsr.GetCntntNode()->GetFrm( - &aPtPos )->GetUpper(), - *pEnd = rCrsr.GetCntntNode(sal_False)->GetFrm( + + const SwCntntNode* pCntNd = rCrsr.GetCntntNode(); + const SwLayoutFrm *pStart = pCntNd->getLayoutFrm( pCntNd->GetDoc()->GetCurrentLayout(), + &aPtPos )->GetUpper(); + pCntNd = rCrsr.GetCntntNode(sal_False); + const SwLayoutFrm *pEnd = pCntNd->getLayoutFrm( pCntNd->GetDoc()->GetCurrentLayout(), &aMkPos )->GetUpper(); SWRECTFN( pStart->GetUpper() ) @@ -2119,7 +2127,7 @@ sal_Bool CheckSplitCells( const SwCursor& rCrsr, sal_uInt16 nDiv, void lcl_InsertRow( SwTableLine &rLine, SwLayoutFrm *pUpper, SwFrm *pSibling ) { - SwRowFrm *pRow = new SwRowFrm( rLine ); + SwRowFrm *pRow = new SwRowFrm( rLine, pUpper ); if ( pUpper->IsTabFrm() && ((SwTabFrm*)pUpper)->IsFollow() ) { SwTabFrm* pTabFrm = (SwTabFrm*)pUpper; @@ -2277,14 +2285,10 @@ void _FndBox::DelFrms( SwTable &rTable ) for ( sal_uInt16 i = nStPos; i <= nEndPos; ++i) { SwFrmFmt *pFmt = rTable.GetTabLines()[i]->GetFrmFmt(); - SwClientIter aIter( *pFmt ); - SwClient* pLast = aIter.GoStart(); - if( pLast ) + SwIterator<SwRowFrm,SwFmt> aIter( *pFmt ); + for ( SwRowFrm* pFrm = aIter.First(); pFrm; pFrm = aIter.Next() ) { - do { - SwFrm *pFrm = PTR_CAST( SwFrm, pLast ); - if ( pFrm && - ((SwRowFrm*)pFrm)->GetTabLine() == rTable.GetTabLines()[i] ) + if ( pFrm->GetTabLine() == rTable.GetTabLines()[i] ) { sal_Bool bDel = sal_True; SwTabFrm *pUp = !pFrm->GetPrev() && !pFrm->GetNext() ? @@ -2372,7 +2376,6 @@ void _FndBox::DelFrms( SwTable &rTable ) delete pFrm; } } - } while( 0 != ( pLast = aIter++ )); } } } @@ -2406,8 +2409,7 @@ void lcl_UpdateRepeatedHeadlines( SwTabFrm& rTabFrm, bool bCalcLowers ) const sal_uInt16 nRepeat = rTable.GetRowsToRepeat(); for ( sal_uInt16 nIdx = 0; nIdx < nRepeat; ++nIdx ) { - SwRowFrm* pHeadline = new SwRowFrm( - *rTable.GetTabLines()[ nIdx ] ); + SwRowFrm* pHeadline = new SwRowFrm( *rTable.GetTabLines()[ nIdx ], &rTabFrm ); pHeadline->SetRepeatedHeadline( true ); pHeadline->Paste( &rTabFrm, pLower ); pHeadline->RegistFlys(); @@ -2441,13 +2443,12 @@ void _FndBox::MakeFrms( SwTable &rTable ) --nEndPos; } //Jetzt die grosse Einfuegeoperation fuer alle Tabllen. - SwClientIter aTabIter( *rTable.GetFrmFmt() ); - for ( SwTabFrm *pTable = (SwTabFrm*)aTabIter.First( TYPE(SwFrm) ); pTable; - pTable = (SwTabFrm*)aTabIter.Next() ) + SwIterator<SwTabFrm,SwFmt> aTabIter( *rTable.GetFrmFmt() ); + for ( SwTabFrm *pTable = aTabIter.First(); pTable; pTable = aTabIter.Next() ) { if ( !pTable->IsFollow() ) { - SwFrm *pSibling = 0; + SwRowFrm *pSibling = 0; SwFrm *pUpperFrm = 0; int i; for ( i = rTable.GetTabLines().Count()-1; @@ -2455,19 +2456,19 @@ void _FndBox::MakeFrms( SwTable &rTable ) { SwTableLine *pLine = pLineBehind ? pLineBehind : rTable.GetTabLines()[static_cast<sal_uInt16>(i)]; - SwClientIter aIter( *pLine->GetFrmFmt() ); - pSibling = (SwFrm*)aIter.First( TYPE(SwFrm) ); + SwIterator<SwRowFrm,SwFmt> aIter( *pLine->GetFrmFmt() ); + pSibling = aIter.First(); while ( pSibling && ( - static_cast<SwRowFrm*>(pSibling)->GetTabLine() != pLine || + pSibling->GetTabLine() != pLine || !lcl_IsLineOfTblFrm( *pTable, *pSibling ) || - static_cast<SwRowFrm*>(pSibling)->IsRepeatedHeadline() || + pSibling->IsRepeatedHeadline() || // --> FME 2005-08-24 #i53647# If !pLineBehind, // IsInSplitTableRow() should be checked. ( pLineBehind && pSibling->IsInFollowFlowRow() ) || (!pLineBehind && pSibling->IsInSplitTableRow() ) ) ) // <-- { - pSibling = (SwFrm*)aIter.Next(); + pSibling = aIter.Next(); } } if ( pSibling ) @@ -2515,32 +2516,31 @@ void _FndBox::MakeNewFrms( SwTable &rTable, const sal_uInt16 nNumber, (nBfPos != USHRT_MAX ? nBfPos + 1 : 0)) / (nNumber + 1); //Den Master-TabFrm suchen - SwClientIter aTabIter( *rTable.GetFrmFmt() ); + SwIterator<SwTabFrm,SwFmt> aTabIter( *rTable.GetFrmFmt() ); SwTabFrm *pTable; - for ( pTable = (SwTabFrm*)aTabIter.First( TYPE(SwFrm) ); pTable; - pTable = (SwTabFrm*)aTabIter.Next() ) + for ( pTable = aTabIter.First(); pTable; pTable = aTabIter.Next() ) { if( !pTable->IsFollow() ) { - SwFrm *pSibling = 0; + SwRowFrm* pSibling = 0; SwLayoutFrm *pUpperFrm = 0; if ( bBehind ) { if ( pLineBehind ) { - SwClientIter aIter( *pLineBehind->GetFrmFmt() ); - pSibling = (SwFrm*)aIter.First( TYPE(SwFrm) ); + SwIterator<SwRowFrm,SwFmt> aIter( *pLineBehind->GetFrmFmt() ); + pSibling = aIter.First(); while ( pSibling && ( // only consider row frames associated with pLineBehind: - static_cast<SwRowFrm*>(pSibling)->GetTabLine() != pLineBehind || + pSibling->GetTabLine() != pLineBehind || // only consider row frames that are in pTables Master-Follow chain: !lcl_IsLineOfTblFrm( *pTable, *pSibling ) || // only consider row frames that are not repeated headlines: - static_cast<SwRowFrm*>(pSibling)->IsRepeatedHeadline() || + pSibling->IsRepeatedHeadline() || // only consider row frames that are not follow flow rows pSibling->IsInFollowFlowRow() ) ) { - pSibling = (SwFrm*)aIter.Next(); + pSibling = aIter.Next(); } } if ( pSibling ) @@ -2571,16 +2571,16 @@ void _FndBox::MakeNewFrms( SwTable &rTable, const sal_uInt16 nNumber, { SwTableLine* pLine = pLineBefore ? pLineBefore : rTable.GetTabLines()[i]; - SwClientIter aIter( *pLine->GetFrmFmt() ); - pSibling = (SwFrm*)aIter.First( TYPE(SwFrm) ); + SwIterator<SwRowFrm,SwFmt> aIter( *pLine->GetFrmFmt() ); + pSibling = aIter.First(); while ( pSibling && ( // only consider row frames associated with pLineBefore: - static_cast<SwRowFrm*>(pSibling)->GetTabLine() != pLine || + pSibling->GetTabLine() != pLine || // only consider row frames that are in pTables Master-Follow chain: !lcl_IsLineOfTblFrm( *pTable, *pSibling ) || // only consider row frames that are not repeated headlines: - static_cast<SwRowFrm*>(pSibling)->IsRepeatedHeadline() || + pSibling->IsRepeatedHeadline() || // 1. case: pLineBefore == 0: // only consider row frames that are not follow flow rows // 2. case: pLineBefore != 0: @@ -2591,13 +2591,13 @@ void _FndBox::MakeNewFrms( SwTable &rTable, const sal_uInt16 nNumber, ( pLineBefore && pSibling->IsInSplitTableRow() ) ) ) ) // <-- { - pSibling = (SwFrm*)aIter.Next(); + pSibling = aIter.Next(); } } pUpperFrm = pSibling->GetUpper(); if ( pLineBefore ) - pSibling = pSibling->GetNext(); + pSibling = (SwRowFrm*) pSibling->GetNext(); sal_uInt16 nMax = nBhPos != USHRT_MAX ? nBhPos - nCnt : @@ -2620,8 +2620,7 @@ void _FndBox::MakeNewFrms( SwTable &rTable, const sal_uInt16 nNumber, ( ( !bBehind && ( nBfPos == USHRT_MAX || nBfPos + 1 < nRowsToRepeat ) ) || ( bBehind && ( ( nBfPos == USHRT_MAX && nRowsToRepeat > 1 ) || nBfPos + 2 < nRowsToRepeat ) ) ) ) { - for ( pTable = (SwTabFrm*)aTabIter.First( TYPE(SwFrm) ); pTable; - pTable = (SwTabFrm*)aTabIter.Next() ) + for ( pTable = aTabIter.First(); pTable; pTable = aTabIter.Next() ) { if ( pTable->Lower() ) { @@ -2672,9 +2671,8 @@ sal_Bool _FndBox::AreLinesToRestore( const SwTable &rTable ) const { // ups. sollte unsere zu wiederholende Kopfzeile geloescht worden // sein?? - SwClientIter aIter( *rTable.GetFrmFmt() ); - for( SwTabFrm* pTable = (SwTabFrm*)aIter.First( TYPE( SwFrm )); - pTable; pTable = (SwTabFrm*)aIter.Next() ) + SwIterator<SwTabFrm,SwFmt> aIter( *rTable.GetFrmFmt() ); + for( SwTabFrm* pTable = aIter.First(); pTable; pTable = aIter.Next() ) { if( pTable->IsFollow() ) { diff --git a/sw/source/core/graphic/ndgrf.cxx b/sw/source/core/graphic/ndgrf.cxx index 73b6c04237b2..b1d1c75b54a7 100644 --- a/sw/source/core/graphic/ndgrf.cxx +++ b/sw/source/core/graphic/ndgrf.cxx @@ -212,10 +212,10 @@ sal_Bool SwGrfNode::ReRead( if( refLink.Is() ) { - if( GetFrm() ) + if( getLayoutFrm( GetDoc()->GetCurrentLayout() ) ) { SwMsgPoolItem aMsgHint( RES_GRF_REREAD_AND_INCACHE ); - Modify( &aMsgHint, &aMsgHint ); + ModifyNotification( &aMsgHint, &aMsgHint ); } // --> OD 2006-11-03 #i59688# // do not load linked graphic, if it isn't a new linked graphic. @@ -306,7 +306,7 @@ sal_Bool SwGrfNode::ReRead( if( bReadGrf && bNewGrf ) { SwMsgPoolItem aMsgHint( RES_UPDATE_ATTR ); - Modify( &aMsgHint, &aMsgHint ); + ModifyNotification( &aMsgHint, &aMsgHint ); } return bReadGrf; @@ -434,7 +434,7 @@ short SwGrfNode::SwapIn( sal_Bool bWaitForData ) // keine default Bitmap mehr, also neu Painten! aGrfObj.SetGraphic( Graphic() ); SwMsgPoolItem aMsgHint( RES_GRAPHIC_PIECE_ARRIVED ); - Modify( &aMsgHint, &aMsgHint ); + ModifyNotification( &aMsgHint, &aMsgHint ); } } else if( aGrfObj.IsSwappedOut() ) { @@ -481,7 +481,7 @@ short SwGrfNode::SwapIn( sal_Bool bWaitForData ) if( 1 == nRet ) { SwMsgPoolItem aMsg( RES_GRAPHIC_SWAPIN ); - Modify( &aMsg, &aMsg ); + ModifyNotification( &aMsg, &aMsg ); } } else @@ -590,7 +590,7 @@ sal_Bool SwGrfNode::RestorePersistentData() IDocumentLinksAdministration* pIDLA = getIDocumentLinksAdministration(); refLink->SetVisible( pIDLA->IsVisibleLinks() ); pIDLA->GetLinkManager().InsertDDELink( refLink ); - if( getIDocumentLayoutAccess()->GetRootFrm() ) + if( getIDocumentLayoutAccess()->GetCurrentLayout() ) //swmod 080218 refLink->Update(); } return sal_True; @@ -1158,7 +1158,7 @@ void SwGrfNode::ApplyInputStream( mbIsStreamReadOnly = bIsStreamReadOnly; mbLinkedInputStreamReady = true; SwMsgPoolItem aMsgHint( RES_LINKED_GRAPHIC_STREAM_ARRIVED ); - Modify( &aMsgHint, &aMsgHint ); + ModifyNotification( &aMsgHint, &aMsgHint ); } } } @@ -1170,7 +1170,7 @@ void SwGrfNode::UpdateLinkWithInputStream() GetLink()->setStreamToLoadFrom( mxInputStream, mbIsStreamReadOnly ); GetLink()->Update(); SwMsgPoolItem aMsgHint( RES_GRAPHIC_ARRIVED ); - Modify( &aMsgHint, &aMsgHint ); + ModifyNotification( &aMsgHint, &aMsgHint ); // --> OD 2008-06-18 #i88291# mxInputStream.clear(); diff --git a/sw/source/core/inc/UndoAttribute.hxx b/sw/source/core/inc/UndoAttribute.hxx index 84423605b5d0..849603e2b534 100644 --- a/sw/source/core/inc/UndoAttribute.hxx +++ b/sw/source/core/inc/UndoAttribute.hxx @@ -192,7 +192,7 @@ class SwUndoFmtAttrHelper : public SwClient public: SwUndoFmtAttrHelper( SwFmt& rFmt, bool bSaveDrawPt = true ); - virtual void Modify( SfxPoolItem*, SfxPoolItem* ); + virtual void Modify( const SfxPoolItem*, const SfxPoolItem* ); SwUndoFmtAttr* GetUndo() const { return m_pUndo.get(); } // release the undo object (so it is not deleted here), and return it diff --git a/sw/source/core/inc/UndoCore.hxx b/sw/source/core/inc/UndoCore.hxx index 41e89dcdd518..35abb46f7cf7 100644 --- a/sw/source/core/inc/UndoCore.hxx +++ b/sw/source/core/inc/UndoCore.hxx @@ -39,6 +39,8 @@ class SwFmtAnchor; class SdrMarkList; class SwUndoDelete; class SwRedlineSaveData; +class SwFrm; +class SwFmt; namespace sw { class UndoManager; @@ -177,7 +179,7 @@ class SwUndoSetFlyFmt : public SwUndo, public SwClient sal_Bool bAnchorChgd; void PutAttr( sal_uInt16 nWhich, const SfxPoolItem* pItem ); - void Modify( SfxPoolItem*, SfxPoolItem* ); + void Modify( const SfxPoolItem*, const SfxPoolItem* ); void GetAnchor( SwFmtAnchor& rAnhor, sal_uLong nNode, xub_StrLen nCntnt ); public: @@ -188,6 +190,7 @@ public: virtual void RedoImpl( ::sw::UndoRedoContext & ); virtual SwRewriter GetRewriter() const; + void DeRegisterFromFormat( SwFmt& ); }; diff --git a/sw/source/core/inc/acorrect.hxx b/sw/source/core/inc/acorrect.hxx index 38975d37969f..d8b4f3ae0ffa 100644..100755 --- a/sw/source/core/inc/acorrect.hxx +++ b/sw/source/core/inc/acorrect.hxx @@ -69,6 +69,7 @@ public: virtual sal_Bool Delete( xub_StrLen nStt, xub_StrLen nEnd ); virtual sal_Bool Insert( xub_StrLen nPos, const String& rTxt ); virtual sal_Bool Replace( xub_StrLen nPos, const String& rTxt ); + virtual sal_Bool ReplaceRange( xub_StrLen nPos, xub_StrLen nLen, const String& rTxt ); virtual sal_Bool SetAttr( xub_StrLen nStt, xub_StrLen nEnd, sal_uInt16 nSlotId, SfxPoolItem& ); diff --git a/sw/source/core/inc/attrhint.hxx b/sw/source/core/inc/attrhint.hxx new file mode 100644 index 000000000000..da2ed160b9c4 --- /dev/null +++ b/sw/source/core/inc/attrhint.hxx @@ -0,0 +1,44 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef _ATTRHINT_HXX +#define _ATTRHINT_HXX + +#include <svl/hint.hxx> + +class SwAttrHint : public SfxHint +{ + sal_Int32 nId; +public: + SwAttrHint( sal_Int32 n ) + : nId(n) + {} + + sal_Int32 GetId() const { return nId; } +}; + +#endif diff --git a/sw/source/core/inc/bodyfrm.hxx b/sw/source/core/inc/bodyfrm.hxx index 5d8a7f30f43b..42b77f36cec8 100644 --- a/sw/source/core/inc/bodyfrm.hxx +++ b/sw/source/core/inc/bodyfrm.hxx @@ -42,7 +42,7 @@ protected: ~SwBodyFrm(); #endif public: - SwBodyFrm( SwFrmFmt* ); + SwBodyFrm( SwFrmFmt*, SwFrm* ); virtual void Paint( const SwRect&, const SwPrintData *pPrintData = NULL ) const; diff --git a/sw/source/core/inc/bookmrk.hxx b/sw/source/core/inc/bookmrk.hxx index 8f1223b7beb6..06933e804888 100644 --- a/sw/source/core/inc/bookmrk.hxx +++ b/sw/source/core/inc/bookmrk.hxx @@ -52,7 +52,6 @@ namespace sw { namespace mark { class MarkBase : virtual public IMark - , private ::boost::noncopyable { public: //getters @@ -106,9 +105,6 @@ namespace sw { namespace mark virtual ~MarkBase(); - // SwClient - virtual void Modify( SfxPoolItem *pOld, SfxPoolItem *pNew ); - const ::com::sun::star::uno::WeakReference< ::com::sun::star::text::XTextContent> & GetXBookmark() const { return m_wXBookmark; } @@ -117,6 +113,9 @@ namespace sw { namespace mark { m_wXBookmark = xBkmk; } protected: + // SwClient + virtual void Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew ); + MarkBase(const SwPaM& rPaM, const ::rtl::OUString& rName); ::boost::scoped_ptr<SwPosition> m_pPos1; diff --git a/sw/source/core/inc/cellfrm.hxx b/sw/source/core/inc/cellfrm.hxx index b50a1a7e3612..66a2f6d36662 100644 --- a/sw/source/core/inc/cellfrm.hxx +++ b/sw/source/core/inc/cellfrm.hxx @@ -42,13 +42,13 @@ class SwCellFrm: public SwLayoutFrm protected: virtual void Format( const SwBorderAttrs *pAttrs = 0 ); + virtual void Modify( const SfxPoolItem*, const SfxPoolItem* ); public: - SwCellFrm( const SwTableBox &, bool bInsertContent = true ); + SwCellFrm( const SwTableBox &, SwFrm*, bool bInsertContent = true ); ~SwCellFrm(); virtual sal_Bool GetCrsrOfst( SwPosition *, Point&, SwCrsrMoveState* = 0 ) const; - virtual void Modify( SfxPoolItem*, SfxPoolItem* ); virtual void Paint( SwRect const&, SwPrintData const*const pPrintData = NULL ) const; virtual void CheckDirection( sal_Bool bVert ); diff --git a/sw/source/core/inc/cntfrm.hxx b/sw/source/core/inc/cntfrm.hxx index 3a21ef14e0bc..5f7c69f71cf4 100644 --- a/sw/source/core/inc/cntfrm.hxx +++ b/sw/source/core/inc/cntfrm.hxx @@ -54,7 +54,7 @@ class SwCntntFrm: public SwFrm, public SwFlowFrm // <-- virtual void MakeAll(); - void _UpdateAttr( SfxPoolItem*, SfxPoolItem*, sal_uInt8 &, + void _UpdateAttr( const SfxPoolItem*, const SfxPoolItem*, sal_uInt8 &, SwAttrSetChg *pa = 0, SwAttrSetChg *pb = 0 ); virtual sal_Bool ShouldBwdMoved( SwLayoutFrm *pNewUpper, sal_Bool, sal_Bool& ); @@ -65,11 +65,11 @@ protected: sal_Bool MakePrtArea( const SwBorderAttrs & ); - virtual void Modify( SfxPoolItem*, SfxPoolItem* ); + virtual void Modify( const SfxPoolItem*, const SfxPoolItem* ); virtual SwTwips ShrinkFrm( SwTwips, sal_Bool bTst = sal_False, sal_Bool bInfo = sal_False ); virtual SwTwips GrowFrm ( SwTwips, sal_Bool bTst = sal_False, sal_Bool bInfo = sal_False ); - SwCntntFrm( SwCntntNode * const ); + SwCntntFrm( SwCntntNode * const, SwFrm* ); public: virtual ~SwCntntFrm(); @@ -109,6 +109,9 @@ public: inline SwCntntFrm* GetNextCntntFrm() const; inline SwCntntFrm* GetPrevCntntFrm() const; + static bool CalcLowers( SwLayoutFrm* pLay, const SwLayoutFrm* pDontLeave, long nBottom, bool bSkipRowSpanCells ); + void RegisterToNode( SwCntntNode& ); + static void DelFrms( const SwCntntNode& ); }; inline SwCntntFrm* SwCntntFrm::GetNextCntntFrm() const diff --git a/sw/source/core/inc/colfrm.hxx b/sw/source/core/inc/colfrm.hxx index 011daf07fa74..0485cdf064d7 100644 --- a/sw/source/core/inc/colfrm.hxx +++ b/sw/source/core/inc/colfrm.hxx @@ -34,7 +34,7 @@ class SwColumnFrm: public SwFtnBossFrm { public: - SwColumnFrm( SwFrmFmt* ); + SwColumnFrm( SwFrmFmt*, SwFrm* ); ~SwColumnFrm(); DECL_FIXEDMEMPOOL_NEWDEL(SwColumnFrm) diff --git a/sw/source/core/inc/fieldhint.hxx b/sw/source/core/inc/fieldhint.hxx new file mode 100644 index 000000000000..82955be53bc8 --- /dev/null +++ b/sw/source/core/inc/fieldhint.hxx @@ -0,0 +1,44 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef _FIELDHINT_HXX +#define _FIELDHINT_HXX + +#include <svl/hint.hxx> + +class SwFieldHint : public SfxHint +{ + SwPaM* pPaM; +public: + SwFieldHint( SwPaM* p ) + : pPaM(p) + {} + + SwPaM* GetPaM() const { return pPaM; } +}; + +#endif diff --git a/sw/source/core/inc/flyfrm.hxx b/sw/source/core/inc/flyfrm.hxx index 7b1adc88c661..61726d03ad92 100644 --- a/sw/source/core/inc/flyfrm.hxx +++ b/sw/source/core/inc/flyfrm.hxx @@ -29,6 +29,7 @@ #define SW_FLYFRM_HXX #include "layfrm.hxx" +#include <list> #include "frmfmt.hxx" class SwPageFrm; @@ -39,8 +40,10 @@ class SwVirtFlyDrawObj; class SwSpzFrmFmts; class SwAttrSetChg; class PolyPolygon; +class SwFlyDrawContact; +class SwDrawContact; +class SwFmt; -// #i26791# #include <anchoredobject.hxx> //Sucht ausgehend von pOldAnch einen Anker fuer Absatzgebundene Rahmen. @@ -59,18 +62,20 @@ class SwFlyFrm : public SwLayoutFrm, public SwAnchoredObject { //darf Locken. Definiert in frmtool.cxx friend void AppendObjs ( const SwSpzFrmFmts *, sal_uLong, SwFrm *, SwPageFrm * ); - friend void AppendAllObjs( const SwSpzFrmFmts * ); friend void Notify( SwFlyFrm *, SwPageFrm *pOld, const SwRect &rOld, const SwRect* pOldPrt ); void InitDrawObj( sal_Bool bNotify ); //Wird von den CToren gerufen. void FinitDrawObj(); //Wird vom CTor gerufen. - void _UpdateAttr( SfxPoolItem*, SfxPoolItem*, sal_uInt8 &, + void _UpdateAttr( const SfxPoolItem*, const SfxPoolItem*, sal_uInt8 &, SwAttrSetChg *pa = 0, SwAttrSetChg *pb = 0 ); using SwLayoutFrm::CalcRel; + sal_uInt32 _GetOrdNumForNewRef( const SwFlyDrawContact* ); + SwVirtFlyDrawObj* CreateNewRef( SwFlyDrawContact* ); + protected: SwFlyFrm *pPrevLink, // Vorgaenger/Nachfolger fuer Verkettung mit @@ -130,7 +135,7 @@ protected: Size CalcRel( const SwFmtFrmSize &rSz ) const; SwTwips CalcAutoWidth() const; - SwFlyFrm( SwFlyFrmFmt*, SwFrm *pAnchor ); + SwFlyFrm( SwFlyFrmFmt*, SwFrm*, SwFrm *pAnchor ); /** method to assure that anchored object is registered at the correct page frame @@ -139,19 +144,17 @@ protected: */ virtual void RegisterAtCorrectPage(); - // #i68520# virtual bool _SetObjTop( const SwTwips _nTop ); virtual bool _SetObjLeft( const SwTwips _nLeft ); - // #i70122# virtual const SwRect GetObjBoundRect() const; + virtual void Modify( const SfxPoolItem*, const SfxPoolItem* ); public: // #i26791# TYPEINFO(); virtual ~SwFlyFrm(); - virtual void Modify( SfxPoolItem*, SfxPoolItem* ); // erfrage vom Client Informationen virtual sal_Bool GetInfo( SfxPoolItem& ) const; virtual void Paint( SwRect const&, @@ -270,6 +273,7 @@ public: format isn't possible, if Writer fly frame is locked resp. col-locked. */ virtual bool IsFormatPossible() const; + static void GetAnchoredObjects( std::list<SwAnchoredObject*>&, const SwFmt& rFmt ); // overwriting "SwFrmFmt *SwLayoutFrm::GetFmt" to provide the correct derived return type. // (This is in order to skip on the otherwise necessary casting of the result to diff --git a/sw/source/core/inc/flyfrms.hxx b/sw/source/core/inc/flyfrms.hxx index cf46533c98e7..8b89e869f21f 100644 --- a/sw/source/core/inc/flyfrms.hxx +++ b/sw/source/core/inc/flyfrms.hxx @@ -69,7 +69,7 @@ protected: virtual void NotifyBackground( SwPageFrm *pPage, const SwRect& rRect, PrepareHint eHint); - SwFlyFreeFrm( SwFlyFrmFmt*, SwFrm *pAnchor ); + SwFlyFreeFrm( SwFlyFrmFmt*, SwFrm*, SwFrm *pAnchor ); public: // --> #i28701# @@ -131,11 +131,10 @@ public: // --> #i28701# TYPEINFO(); - SwFlyLayFrm( SwFlyFrmFmt*, SwFrm *pAnchor ); + SwFlyLayFrm( SwFlyFrmFmt*, SwFrm*, SwFrm *pAnchor ); SwFlyLayFrm( SwFlyLayFrm& ); - - virtual void Modify( SfxPoolItem*, SfxPoolItem* ); - +protected: + virtual void Modify( const SfxPoolItem*, const SfxPoolItem* ); }; //Die Flys, die an einem Cntnt haengen nicht aber im Inhalt @@ -155,14 +154,13 @@ protected: @author OD */ virtual void RegisterAtCorrectPage(); + virtual void Modify( const SfxPoolItem*, const SfxPoolItem* ); public: // --> #i28701# TYPEINFO(); - SwFlyAtCntFrm( SwFlyFrmFmt*, SwFrm *pAnchor ); - - virtual void Modify( SfxPoolItem*, SfxPoolItem* ); + SwFlyAtCntFrm( SwFlyFrmFmt*, SwFrm*, SwFrm *pAnchor ); void SetAbsPos( const Point &rNew ); @@ -194,16 +192,16 @@ protected: virtual void NotifyBackground( SwPageFrm *pPage, const SwRect& rRect, PrepareHint eHint); virtual void MakeAll(); + virtual void Modify( const SfxPoolItem*, const SfxPoolItem* ); public: // --> #i28701# TYPEINFO(); - SwFlyInCntFrm( SwFlyFrmFmt*, SwFrm *pAnchor ); + SwFlyInCntFrm( SwFlyFrmFmt*, SwFrm*, SwFrm *pAnchor ); virtual ~SwFlyInCntFrm(); virtual void Format( const SwBorderAttrs *pAttrs = 0 ); - virtual void Modify( SfxPoolItem*, SfxPoolItem* ); void SetRefPoint( const Point& rPoint, const Point &rRelAttr, const Point &rRelPos ); diff --git a/sw/source/core/inc/frame.hxx b/sw/source/core/inc/frame.hxx index b7f60a96bf7c..56bdd8d9e230 100644 --- a/sw/source/core/inc/frame.hxx +++ b/sw/source/core/inc/frame.hxx @@ -35,6 +35,7 @@ #include "swtypes.hxx" // fuer SwTwips #include "swrect.hxx" #include "calbck.hxx" // fuer SwClient +#include <svl/brdcst.hxx> #if OSL_DEBUG_LEVEL > 1 #include <libxml/encoding.h> @@ -63,12 +64,10 @@ class SvxBrushItem; class SwSelectionList; struct SwPosition; struct SwCrsrMoveState; +class SwFmt; class SwPrintData; - -// --> OD 2004-07-06 #i28701# class SwSortedObjs; class SwAnchoredObject; -// <-- //Jeder FrmTyp findet sich hier in einem Bit wieder. //Die Bits muessen so gesetzt werden, dass mit einer Maskierung festgestellt @@ -278,7 +277,7 @@ enum MakePageType //typedef SdrObject* SdrObjectPtr; //SV_DECL_PTRARR(SwDrawObjs,SdrObjectPtr,1,1); -class SwFrm: public SwClient +class SwFrm: public SwClient, public SfxBroadcaster { //Der verkappte Frm friend class SwFlowFrm; @@ -312,6 +311,7 @@ class SwFrm: public SwClient const sal_uInt32 mnFrmId; // <-- + SwRootFrm *mpRoot; SwLayoutFrm *pUpper; SwFrm *pNext; SwFrm *pPrev; @@ -382,7 +382,7 @@ class SwFrm: public SwClient SwCntntFrm* _FindPrevCnt( const bool _bInSameFtn = false ); - void _UpdateAttrFrm( SfxPoolItem*, SfxPoolItem*, sal_uInt8 & ); + void _UpdateAttrFrm( const SfxPoolItem*, const SfxPoolItem*, sal_uInt8 & ); SwFrm* _GetIndNext(); void SetDirFlags( sal_Bool bVert ); @@ -441,6 +441,9 @@ protected: void ColLock() { bColLocked = sal_True; } void ColUnlock() { bColLocked = sal_False; } + // Only used by SwRootFrm Ctor to get 'this' into mpRoot... + void setRootFrm( SwRootFrm* pRoot ) { mpRoot = pRoot; } + SwPageFrm *InsertPage( SwPageFrm *pSibling, sal_Bool bFtn ); void PrepareMake(); void OptPrepareMake(); @@ -459,10 +462,10 @@ protected: virtual SwTwips ShrinkFrm( SwTwips, sal_Bool bTst = sal_False, sal_Bool bInfo = sal_False ) = 0; virtual SwTwips GrowFrm ( SwTwips, sal_Bool bTst = sal_False, sal_Bool bInfo = sal_False ) = 0; - SwModify *GetDep() { return pRegisteredIn; } - const SwModify *GetDep() const { return pRegisteredIn; } + SwModify *GetDep() { return GetRegisteredInNonConst(); } + const SwModify *GetDep() const { return GetRegisteredIn(); } - SwFrm( SwModify* ); + SwFrm( SwModify*, SwFrm* ); void CheckDir( sal_uInt16 nDir, sal_Bool bVert, sal_Bool bOnlyBiDi, sal_Bool bBrowse ); @@ -497,6 +500,7 @@ protected: //Schatten und Umrandung painten void PaintShadow( const SwRect&, SwRect&, const SwBorderAttrs& ) const; + virtual void Modify( const SfxPoolItem*, const SfxPoolItem* ); public: TYPEINFO(); //Bereits in Basisklasse Client drin. @@ -648,7 +652,6 @@ public: //Fussnote einzufuegen (nicht z.B. in wiederholten TabellenHeadlines). sal_Bool IsFtnAllowed() const; - virtual void Modify( SfxPoolItem*, SfxPoolItem* ); virtual void Format( const SwBorderAttrs *pAttrs = 0 ); virtual void CheckDirection( sal_Bool bVert ); @@ -660,10 +663,6 @@ public: inline sal_Bool HasFixSize() const { return bFixSize; } inline void SetFixSize( sal_Bool bNew ) { bFixSize = bNew; } - //Kann 0 liefern, pruefen auch ob die Shell zum richtigen Dokument - //gehoert. Impl in frmsh.hxx - ViewShell *GetShell() const; - //Prueft alle Seiten ab der Uebergebenen und korrigiert ggf. static void CheckPageDescs( SwPageFrm *pStart, sal_Bool bNotifyFields = sal_True ); @@ -671,7 +670,7 @@ public: SwFrm *GetNext() { return pNext; } SwFrm *GetPrev() { return pPrev; } SwLayoutFrm *GetUpper() { return pUpper; } - SwRootFrm *FindRootFrm(); + SwRootFrm *getRootFrm(){ return mpRoot; } SwPageFrm *FindPageFrm(); SwFrm *FindColFrm(); SwRowFrm *FindRowFrm(); @@ -685,6 +684,7 @@ public: const SwFrm *GetNext() const { return pNext; } const SwFrm *GetPrev() const { return pPrev; } const SwLayoutFrm *GetUpper() const { return pUpper; } + const SwRootFrm *getRootFrm() const { return mpRoot; } inline SwTabFrm *FindTabFrm(); inline SwFtnFrm *FindFtnFrm(); inline SwFlyFrm *FindFlyFrm(); @@ -695,7 +695,6 @@ public: // <-- inline SwFrm *FindPrev(); inline const SwPageFrm *FindPageFrm() const; - inline const SwRootFrm *FindRootFrm() const; inline const SwFtnBossFrm *FindFtnBossFrm( sal_Bool bFtn = sal_False ) const; inline const SwFrm *FindColFrm() const; inline const SwFrm *FindFooterOrHeader() const; @@ -960,6 +959,8 @@ public: bool IsInCoveredCell() const; // FME 2007-08-30 #i81146# new loop control + bool KnowsFormat( const SwFmt& rFmt ) const; + void RegisterToFormat( SwFmt& rFmt ); void ValidateThisAndAllLowers( const sal_uInt16 nStage ); public: @@ -1138,10 +1139,6 @@ inline const SwPageFrm *SwFrm::FindPageFrm() const { return ((SwFrm*)this)->FindPageFrm(); } -inline const SwRootFrm *SwFrm::FindRootFrm() const -{ - return ((SwFrm*)this)->FindRootFrm(); -} inline const SwFrm *SwFrm::FindColFrm() const { return ((SwFrm*)this)->FindColFrm(); diff --git a/sw/source/core/inc/frmtool.hxx b/sw/source/core/inc/frmtool.hxx index eb8e04eb196d..0cc9898089b6 100644 --- a/sw/source/core/inc/frmtool.hxx +++ b/sw/source/core/inc/frmtool.hxx @@ -37,6 +37,7 @@ class SwPageFrm; class SwFlyFrm; class SwCntntFrm; +class SwRootFrm; class SwDoc; class SwAttrSet; class SdrObject; @@ -137,7 +138,7 @@ const SwFrm * MA_FASTCALL FindPage( const SwRect &rRect, const SwFrm *pPage ); // wird von SwCntntNode::GetFrm und von SwFlyFrm::GetFrm // gerufen -SwFrm* GetFrmOfModify( SwModify const&, sal_uInt16 const nFrmType, const Point* = 0, +SwFrm* GetFrmOfModify( const SwRootFrm* pLayout, SwModify const&, sal_uInt16 const nFrmType, const Point* = 0, const SwPosition *pPos = 0, const sal_Bool bCalcFrm = sal_False ); @@ -561,7 +562,7 @@ class SwDeletionChecker SwDeletionChecker( const SwFrm* pFrm ) : mpFrm( pFrm ), - mpRegIn( pFrm ? pFrm->GetRegisteredIn() : 0 ) + mpRegIn( pFrm ? const_cast<SwFrm*>(pFrm)->GetRegisteredIn() : 0 ) { } diff --git a/sw/source/core/inc/ftnboss.hxx b/sw/source/core/inc/ftnboss.hxx index 793bf0c8866a..21aab8886a39 100644 --- a/sw/source/core/inc/ftnboss.hxx +++ b/sw/source/core/inc/ftnboss.hxx @@ -71,7 +71,7 @@ protected: void InsertFtn( SwFtnFrm * ); static void ResetFtn( const SwFtnFrm *pAssumed ); public: - inline SwFtnBossFrm( SwFrmFmt* pFmt) : SwLayoutFrm( pFmt ) {} + inline SwFtnBossFrm( SwFrmFmt* pFmt, SwFrm* pSib ) : SwLayoutFrm( pFmt, pSib ) {} SwLayoutFrm *FindBodyCont(); inline const SwLayoutFrm *FindBodyCont() const; diff --git a/sw/source/core/inc/ftnfrm.hxx b/sw/source/core/inc/ftnfrm.hxx index b4e7e3b7f5f4..773c4eca68b7 100644 --- a/sw/source/core/inc/ftnfrm.hxx +++ b/sw/source/core/inc/ftnfrm.hxx @@ -44,7 +44,7 @@ class SwFtnFrm; class SwFtnContFrm: public SwLayoutFrm { public: - SwFtnContFrm( SwFrmFmt* ); + SwFtnContFrm( SwFrmFmt*, SwFrm* ); const SwFtnFrm* FindFootNote() const; @@ -80,7 +80,7 @@ protected: public: - SwFtnFrm( SwFrmFmt*, SwCntntFrm*, SwTxtFtn* ); + SwFtnFrm( SwFrmFmt*, SwFrm*, SwCntntFrm*, SwTxtFtn* ); virtual void Cut(); virtual void Paste( SwFrm* pParent, SwFrm* pSibling = 0 ); diff --git a/sw/source/core/inc/hffrm.hxx b/sw/source/core/inc/hffrm.hxx index c3705d29f1c5..39f09e9bd45a 100644 --- a/sw/source/core/inc/hffrm.hxx +++ b/sw/source/core/inc/hffrm.hxx @@ -40,7 +40,7 @@ protected: void FormatPrt(SwTwips & nUL, const SwBorderAttrs * pAttrs); inline sal_Bool GetEatSpacing() const; // in hffrm.cxx public: - SwHeadFootFrm(SwFrmFmt * pFrm, sal_uInt16 aType); + SwHeadFootFrm(SwFrmFmt * pFrm, SwFrm*, sal_uInt16 aType); virtual void Format( const SwBorderAttrs *pAttrs = 0 ); virtual SwTwips GrowFrm( SwTwips, sal_Bool bTst = sal_False, sal_Bool bInfo = sal_False ); @@ -51,7 +51,7 @@ public: class SwHeaderFrm: public SwHeadFootFrm { public: - SwHeaderFrm( SwFrmFmt* pFrm ) : SwHeadFootFrm(pFrm, FRMC_HEADER) {}; + SwHeaderFrm( SwFrmFmt* pFrm, SwFrm* pSib ) : SwHeadFootFrm(pFrm, pSib, FRMC_HEADER) {}; DECL_FIXEDMEMPOOL_NEWDEL(SwHeaderFrm) }; @@ -59,7 +59,7 @@ public: class SwFooterFrm: public SwHeadFootFrm { public: - SwFooterFrm( SwFrmFmt* pFrm ) : SwHeadFootFrm(pFrm, FRMC_FOOTER) {}; + SwFooterFrm( SwFrmFmt* pFrm, SwFrm* pSib ) : SwHeadFootFrm(pFrm, pSib, FRMC_FOOTER) {}; DECL_FIXEDMEMPOOL_NEWDEL(SwFooterFrm) }; diff --git a/sw/source/core/inc/layfrm.hxx b/sw/source/core/inc/layfrm.hxx index 093549d057da..828e45fe8b27 100644 --- a/sw/source/core/inc/layfrm.hxx +++ b/sw/source/core/inc/layfrm.hxx @@ -103,7 +103,7 @@ public: const SwCrsrMoveState *pCMS = 0, const sal_Bool bDefaultExpand = sal_True ) const; - SwLayoutFrm( SwFrmFmt* ); + SwLayoutFrm( SwFrmFmt*, SwFrm* ); ~SwLayoutFrm(); virtual void Paint( SwRect const&, diff --git a/sw/source/core/inc/notxtfrm.hxx b/sw/source/core/inc/notxtfrm.hxx index 584a23d8acbe..17494b01a7ea 100644 --- a/sw/source/core/inc/notxtfrm.hxx +++ b/sw/source/core/inc/notxtfrm.hxx @@ -51,11 +51,11 @@ class SwNoTxtFrm: public SwCntntFrm void PaintPicture( OutputDevice*, const SwRect& ) const; protected: virtual void MakeAll(); + virtual void Modify( const SfxPoolItem*, const SfxPoolItem* ); public: - SwNoTxtFrm( SwNoTxtNode * const ); + SwNoTxtFrm( SwNoTxtNode * const, SwFrm* ); ~SwNoTxtFrm(); - virtual void Modify( SfxPoolItem*, SfxPoolItem* ); virtual void Paint( SwRect const&, SwPrintData const*const pPrintData = NULL ) const; virtual sal_Bool GetCharRect( SwRect &, const SwPosition&, diff --git a/sw/source/core/inc/pagedeschint.hxx b/sw/source/core/inc/pagedeschint.hxx new file mode 100644 index 000000000000..b18ed39e3315 --- /dev/null +++ b/sw/source/core/inc/pagedeschint.hxx @@ -0,0 +1,46 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef _PAGEDESCHINT_HXX +#define _PAGEDESCHINT_HXX + +#include <svl/hint.hxx> + +class SwPageDesc; + +class SwPageDescHint : public SfxHint +{ + SwPageDesc* pPageDesc; +public: + SwPageDescHint( SwPageDesc* p ) + : pPageDesc(p) + {} + + SwPageDesc* GetPageDesc() const { return const_cast<SwPageDesc*>(pPageDesc); } +}; + +#endif diff --git a/sw/source/core/inc/pagefrm.hxx b/sw/source/core/inc/pagefrm.hxx index 392790a7cd78..92b11aed27ea 100644 --- a/sw/source/core/inc/pagefrm.hxx +++ b/sw/source/core/inc/pagefrm.hxx @@ -89,7 +89,7 @@ class SwPageFrm: public SwFtnBossFrm static const sal_Int8 mnShadowPxWidth; - void _UpdateAttr( SfxPoolItem*, SfxPoolItem*, sal_uInt8 &, + void _UpdateAttr( const SfxPoolItem*, const SfxPoolItem*, sal_uInt8 &, SwAttrSetChg *pa = 0, SwAttrSetChg *pb = 0 ); // Anpassen der max. Fussnotenhoehen in den einzelnen Spalten @@ -159,11 +159,12 @@ class SwPageFrm: public SwFtnBossFrm protected: virtual void MakeAll(); + virtual void Modify( const SfxPoolItem*, const SfxPoolItem* ); public: DECL_FIXEDMEMPOOL_NEWDEL(SwPageFrm) - SwPageFrm( SwFrmFmt*, SwPageDesc* ); + SwPageFrm( SwFrmFmt*, SwFrm*, SwPageDesc* ); ~SwPageFrm(); //public, damit die ViewShell beim Umschalten vom BrowseMode darauf @@ -217,7 +218,6 @@ public: virtual sal_Bool GetCrsrOfst( SwPosition *, Point&, SwCrsrMoveState* = 0 ) const; - virtual void Modify( SfxPoolItem*, SfxPoolItem* ); // erfrage vom Client Informationen virtual sal_Bool GetInfo( SfxPoolItem& ) const; diff --git a/sw/source/core/inc/prevwpage.hxx b/sw/source/core/inc/prevwpage.hxx index ab42c6295742..dd35bb65d96e 100644 --- a/sw/source/core/inc/prevwpage.hxx +++ b/sw/source/core/inc/prevwpage.hxx @@ -1,4 +1,31 @@ /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + #ifndef _PREVIEWPAGES_HXX #define _PREVIEWPAGES_HXX diff --git a/sw/source/core/inc/rolbck.hxx b/sw/source/core/inc/rolbck.hxx index 84f64e309d70..df9da4bfb9b4 100644 --- a/sw/source/core/inc/rolbck.hxx +++ b/sw/source/core/inc/rolbck.hxx @@ -413,14 +413,14 @@ private: void _MakeSetWhichIds(); -public: +protected: + virtual void Modify( const SfxPoolItem* pOld, const SfxPoolItem* pNew ); +public: SwRegHistory( SwHistory* pHst ); SwRegHistory( const SwNode& rNd, SwHistory* pHst ); SwRegHistory( SwModify* pRegIn, const SwNode& rNd, SwHistory* pHst ); - virtual void Modify( SfxPoolItem* pOld, SfxPoolItem* pNew ); - /// @return true if at least 1 item was inserted bool InsertItems( const SfxItemSet& rSet, xub_StrLen const nStart, xub_StrLen const nEnd, diff --git a/sw/source/core/inc/rootfrm.hxx b/sw/source/core/inc/rootfrm.hxx index ac404df62b35..64ad72101420 100644 --- a/sw/source/core/inc/rootfrm.hxx +++ b/sw/source/core/inc/rootfrm.hxx @@ -167,6 +167,11 @@ public: //MasterObjekte aus der Page entfernen (von den Ctoren gerufen). static void RemoveMasterObjs( SdrPage *pPg ); + void AllCheckPageDescs() const;//swmod 080226 + void AllInvalidateAutoCompleteWords() const;//swmod 080305 + void AllAddPaintRect() const; + void AllRemoveFtns() ;//swmod 080305 + void AllInvalidateSmartTagsOrSpelling(sal_Bool bSmartTags) const;//swmod 080307 //Virtuelles Device ausgeben (z.B. wenn Animationen ins Spiel kommen) static sal_Bool FlushVout(); //Clipping sparen, wenn im Vout eh genau das Cliprechteck ausgegeben wird @@ -174,6 +179,7 @@ public: SwRootFrm( SwFrmFmt*, ViewShell* ); ~SwRootFrm(); + void Init(SwFrmFmt*); ViewShell *GetCurrShell() const { return pCurrShell; } void DeRegisterShell( ViewShell *pSh ); diff --git a/sw/source/core/inc/rowfrm.hxx b/sw/source/core/inc/rowfrm.hxx index 8055ce869a10..d8c3abb0346d 100644 --- a/sw/source/core/inc/rowfrm.hxx +++ b/sw/source/core/inc/rowfrm.hxx @@ -55,13 +55,13 @@ class SwRowFrm: public SwLayoutFrm protected: virtual void MakeAll(); + virtual void Modify( const SfxPoolItem*, const SfxPoolItem* ); public: - SwRowFrm( const SwTableLine &, bool bInsertContent = true ); + SwRowFrm( const SwTableLine &, SwFrm*, bool bInsertContent = true ); ~SwRowFrm(); virtual void Cut(); - virtual void Modify( SfxPoolItem*, SfxPoolItem* ); //Zum Anmelden der Flys nachdem eine Zeile erzeugt _und_ eingefuegt wurde. //Muss vom Erzeuger gerufen werden, denn erst nach dem Konstruieren wird diff --git a/sw/source/core/inc/sectfrm.hxx b/sw/source/core/inc/sectfrm.hxx index f06ff2a4a5d1..8c1b84bbd5b8 100644 --- a/sw/source/core/inc/sectfrm.hxx +++ b/sw/source/core/inc/sectfrm.hxx @@ -46,7 +46,7 @@ class SwSectionFrm: public SwLayoutFrm, public SwFlowFrm { SwSection* pSection; - void _UpdateAttr( SfxPoolItem*, SfxPoolItem*, sal_uInt8 &, + void _UpdateAttr( const SfxPoolItem*, const SfxPoolItem*, sal_uInt8 &, SwAttrSetChg *pa = 0, SwAttrSetChg *pb = 0 ); void _Cut( sal_Bool bRemove ); // Is there a FtnContainer? @@ -60,8 +60,11 @@ protected: virtual void MakeAll(); virtual sal_Bool ShouldBwdMoved( SwLayoutFrm *pNewUpper, sal_Bool bHead, sal_Bool &rReformat ); virtual void Format( const SwBorderAttrs *pAttrs = 0 ); + virtual void Modify( const SfxPoolItem*, const SfxPoolItem* ); + virtual void SwClientNotify( const SwModify&, const SfxHint& ); + public: - SwSectionFrm( SwSection & ); //Inhalt wird nicht erzeugt! + SwSectionFrm( SwSection &, SwFrm* ); //Inhalt wird nicht erzeugt! SwSectionFrm( SwSectionFrm &, sal_Bool bMaster );//_Nur_ zum Erzeugen von Master/Follows ~SwSectionFrm(); @@ -70,7 +73,6 @@ public: virtual void Cut(); virtual void Paste( SwFrm* pParent, SwFrm* pSibling = 0 ); - virtual void Modify( SfxPoolItem*, SfxPoolItem* ); inline const SwSectionFrm *GetFollow() const; inline SwSectionFrm *GetFollow(); diff --git a/sw/source/core/inc/tabfrm.hxx b/sw/source/core/inc/tabfrm.hxx index 184e649b27ac..3527e2f6deff 100644 --- a/sw/source/core/inc/tabfrm.hxx +++ b/sw/source/core/inc/tabfrm.hxx @@ -103,7 +103,7 @@ class SwTabFrm: public SwLayoutFrm, public SwFlowFrm bool Split( const SwTwips nCutPos, bool bTryToSplit, bool bTableRowKeep ); bool Join(); - void _UpdateAttr( SfxPoolItem*, SfxPoolItem*, sal_uInt8 &, + void _UpdateAttr( const SfxPoolItem*, const SfxPoolItem*, sal_uInt8 &, SwAttrSetChg *pa = 0, SwAttrSetChg *pb = 0 ); virtual sal_Bool ShouldBwdMoved( SwLayoutFrm *pNewUpper, sal_Bool bHead, sal_Bool &rReformat ); @@ -111,10 +111,12 @@ class SwTabFrm: public SwLayoutFrm, public SwFlowFrm protected: virtual void MakeAll(); virtual void Format( const SwBorderAttrs *pAttrs = 0 ); + virtual void Modify( const SfxPoolItem*, const SfxPoolItem* ); //Aendert nur die Framesize, nicht die PrtArea-SSize virtual SwTwips GrowFrm ( SwTwips, sal_Bool bTst = sal_False, sal_Bool bInfo = sal_False ); + public: - SwTabFrm( SwTable & ); //Immer nach dem erzeugen _und_ pasten das + SwTabFrm( SwTable &, SwFrm* ); //Immer nach dem erzeugen _und_ pasten das //Regist Flys rufen! SwTabFrm( SwTabFrm & ); //_Nur_ zum erzeugen von Follows ~SwTabFrm(); @@ -128,7 +130,6 @@ public: inline SwTabFrm *GetFollow(); SwTabFrm* FindMaster( bool bFirstMaster = false ) const; - virtual void Modify( SfxPoolItem*, SfxPoolItem* ); virtual sal_Bool GetInfo( SfxPoolItem &rHnt ) const; virtual void Paint( SwRect const&, SwPrintData const*const pPrintData = NULL ) const; diff --git a/sw/source/core/inc/txtfrm.hxx b/sw/source/core/inc/txtfrm.hxx index fcb88f8b038c..07deaf40678c 100644 --- a/sw/source/core/inc/txtfrm.hxx +++ b/sw/source/core/inc/txtfrm.hxx @@ -227,6 +227,8 @@ class SwTxtFrm: public SwCntntFrm xub_StrLen nInsertPos, xub_StrLen nActPos, xub_StrLen &nChgStart, xub_StrLen &nChgEnd, xub_StrLen &nInvStart, xub_StrLen &nInvEnd); +protected: + virtual void Modify( const SfxPoolItem*, const SfxPoolItem* ); public: @@ -294,7 +296,6 @@ public: SwRect Paint(); virtual void Paint( SwRect const&, SwPrintData const*const pPrintData = NULL ) const; - virtual void Modify( SfxPoolItem*, SfxPoolItem* ); virtual sal_Bool GetInfo( SfxPoolItem & ) const; //Layoutorientiertes Cursortravelling: Linker, rechter Rand, @@ -338,7 +339,7 @@ public: inline const SwTxtNode *GetTxtNode() const { return (SwTxtNode*)SwCntntFrm::GetNode(); } - SwTxtFrm(SwTxtNode * const); + SwTxtFrm(SwTxtNode * const, SwFrm* ); virtual ~SwTxtFrm(); // SwCntntFrm: der "kurze Dienstweg" fuer die Frames. @@ -607,6 +608,8 @@ public: return mnHeightOfLastLine; } + static void repaintTextFrames( const SwTxtNode& rNode ); + #if OSL_DEBUG_LEVEL > 1 virtual void dumpAsXmlAttributes(xmlTextWriterPtr writer); #endif diff --git a/sw/source/core/layout/atrfrm.cxx b/sw/source/core/layout/atrfrm.cxx index 6d224e058aa1..f984ddb85a04 100644 --- a/sw/source/core/layout/atrfrm.cxx +++ b/sw/source/core/layout/atrfrm.cxx @@ -100,22 +100,17 @@ #include <unoframe.hxx> #include <unotextbodyhf.hxx> #include <SwStyleNameMapper.hxx> -/// OD 22.08.2002 #99657# -/// include definition of class SvxBrushItem and GraphicObject -/// in order to determine, if background is transparent. #include <editeng/brshitem.hxx> #include <svtools/grfmgr.hxx> - #include <cmdid.h> #include <unomid.h> #include <comcore.hrc> #include <svx/svdundo.hxx> // #111827# -// OD 2004-05-24 #i28701# #include <sortedobjs.hxx> -// --> OD 2006-03-06 #125892# #include <HandleAnchorNodeChg.hxx> -// <-- #include <svl/cjkoptions.hxx> +#include <switerator.hxx> +#include <pagedeschint.hxx> using namespace ::com::sun::star; using ::rtl::OUString; @@ -191,7 +186,7 @@ void DelHFFormat( SwClient *pToRemove, SwFrmFmt *pFmt ) { // Klammer, weil im DTOR SwClientIter das Flag bTreeChg zurueck // gesetzt wird. Unguenstig, wenn das Format vorher zerstoert wird. - SwClientIter aIter( *pFmt ); + SwClientIter aIter( *pFmt ); // TODO SwClient *pLast = aIter.GoStart(); if( pLast ) do { @@ -225,16 +220,12 @@ void DelHFFormat( SwClient *pToRemove, SwFrmFmt *pFmt ) if ( pNode->IsCntntNode() && ((SwCntntNode*)pNode)->GetDepends() ) { - SwClientIter aIter( *(SwCntntNode*)pNode ); - do + SwCrsrShell *pShell = SwIterator<SwCrsrShell,SwCntntNode>::FirstElement( *(SwCntntNode*)pNode ); + if( pShell ) { - if( aIter()->ISA( SwCrsrShell ) ) - { - ((SwCrsrShell*)aIter())->ParkCrsr( aIdx ); + pShell->ParkCrsr( aIdx ); aIdx = nEnd-1; - break; - } - } while ( aIter++ ); + } } aIdx++; pNode = & aIdx.GetNode(); @@ -527,7 +518,7 @@ SwFmtHeader::SwFmtHeader( sal_Bool bOn ) int SwFmtHeader::operator==( const SfxPoolItem& rAttr ) const { OSL_ENSURE( SfxPoolItem::operator==( rAttr ), "keine gleichen Attribute" ); - return ( pRegisteredIn == ((SwFmtHeader&)rAttr).GetRegisteredIn() && + return ( GetRegisteredIn() == ((SwFmtHeader&)rAttr).GetRegisteredIn() && bActive == ((SwFmtHeader&)rAttr).IsActive() ); } @@ -536,6 +527,11 @@ SfxPoolItem* SwFmtHeader::Clone( SfxItemPool* ) const return new SwFmtHeader( *this ); } +void SwFmtHeader::RegisterToFormat( SwFmt& rFmt ) +{ + rFmt.Add(this); +} + // class SwFmtFooter // Implementierung teilweise inline im hxx @@ -566,10 +562,15 @@ SwFmtFooter::SwFmtFooter( sal_Bool bOn ) DelHFFormat( this, GetFooterFmt() ); } +void SwFmtFooter::RegisterToFormat( SwFmt& rFmt ) +{ + rFmt.Add(this); +} + int SwFmtFooter::operator==( const SfxPoolItem& rAttr ) const { OSL_ENSURE( SfxPoolItem::operator==( rAttr ), "keine gleichen Attribute" ); - return ( pRegisteredIn == ((SwFmtFooter&)rAttr).GetRegisteredIn() && + return ( GetRegisteredIn() == ((SwFmtFooter&)rAttr).GetRegisteredIn() && bActive == ((SwFmtFooter&)rAttr).IsActive() ); } @@ -643,6 +644,11 @@ SwFmtPageDesc::SwFmtPageDesc( const SwPageDesc *pDesc ) SwFmtPageDesc::~SwFmtPageDesc() {} +bool SwFmtPageDesc::KnowsPageDesc() const +{ + return (GetRegisteredIn() != 0); +} + int SwFmtPageDesc::operator==( const SfxPoolItem& rAttr ) const { OSL_ENSURE( SfxPoolItem::operator==( rAttr ), "keine gleichen Attribute" ); @@ -656,7 +662,39 @@ SfxPoolItem* SwFmtPageDesc::Clone( SfxItemPool* ) const return new SwFmtPageDesc( *this ); } -void SwFmtPageDesc::Modify( SfxPoolItem* pOld, SfxPoolItem* pNew ) +void SwFmtPageDesc::SwClientNotify( const SwModify&, const SfxHint& rHint ) +{ + const SwPageDescHint* pHint = dynamic_cast<const SwPageDescHint*>(&rHint); + if ( pHint ) + { + // mba: shouldn't that be broadcasted also? + SwFmtPageDesc aDfltDesc( pHint->GetPageDesc() ); + SwPageDesc* pDesc = pHint->GetPageDesc(); + const SwModify* pMod = GetDefinedIn(); + if ( pMod ) + { + if( pMod->ISA( SwCntntNode ) ) + ((SwCntntNode*)pMod)->SetAttr( aDfltDesc ); + else if( pMod->ISA( SwFmt )) + ((SwFmt*)pMod)->SetFmtAttr( aDfltDesc ); + else + { + OSL_FAIL( "What kind of SwModify is this?" ); + RegisterToPageDesc( *pDesc ); + } + } + else + // there could be an Undo-copy + RegisterToPageDesc( *pDesc ); + } +} + +void SwFmtPageDesc::RegisterToPageDesc( SwPageDesc& rDesc ) +{ + rDesc.Add( this ); +} + +void SwFmtPageDesc::Modify( const SfxPoolItem* pOld, const SfxPoolItem* pNew ) { if( !pDefinedIn ) return; @@ -2441,7 +2479,7 @@ SfxPoolItem* SwHeaderAndFooterEatSpacingItem::Clone( SfxItemPool* ) const TYPEINIT1( SwFrmFmt, SwFmt ); IMPL_FIXEDMEMPOOL_NEWDEL_DLL( SwFrmFmt, 20, 20 ) -void SwFrmFmt::Modify( SfxPoolItem* pOld, SfxPoolItem* pNew ) +void SwFrmFmt::Modify( const SfxPoolItem* pOld, const SfxPoolItem* pNew ) { SwFmtHeader *pH = 0; SwFmtFooter *pF = 0; @@ -2463,13 +2501,13 @@ void SwFrmFmt::Modify( SfxPoolItem* pOld, SfxPoolItem* pNew ) if( pH && pH->IsActive() && !pH->GetHeaderFmt() ) { //Hat er keinen, mach ich ihm einen SwFrmFmt *pFmt = GetDoc()->MakeLayoutFmt( RND_STD_HEADER, 0 ); - pFmt->Add( pH ); + pH->RegisterToFormat( *pFmt ); } if( pF && pF->IsActive() && !pF->GetFooterFmt() ) { //Hat er keinen, mach ich ihm einen SwFrmFmt *pFmt = GetDoc()->MakeLayoutFmt( RND_STD_FOOTER, 0 ); - pFmt->Add( pF ); + pF->RegisterToFormat( *pFmt ); } // MIB 24.3.98: Modify der Basisklasse muss immer gerufen werden, z.B. @@ -2483,20 +2521,22 @@ void SwFrmFmt::Modify( SfxPoolItem* pOld, SfxPoolItem* pNew ) } } +void SwFrmFmt::RegisterToFormat( SwFmt& rFmt ) +{ + rFmt.Add( this ); +} + //Vernichtet alle Frms, die in aDepend angemeldet sind. void SwFrmFmt::DelFrms() { - SwClientIter aIter( *this ); - SwClient * pLast = aIter.GoStart(); + SwIterator<SwFrm,SwFmt> aIter( *this ); + SwFrm * pLast = aIter.First(); if( pLast ) do { - if ( pLast->ISA(SwFrm) ) - { - ((SwFrm*)pLast)->Cut(); + pLast->Cut(); delete pLast; - } - } while( 0 != ( pLast = aIter++ )); + } while( 0 != ( pLast = aIter.Next() )); } void SwFrmFmt::MakeFrms() @@ -2520,7 +2560,7 @@ SwRect SwFrmFmt::FindLayoutRect( const sal_Bool bPrtArea, const Point* pPoint, SwNode2Layout aTmp( *pSectNd, pSectNd->GetIndex() - 1 ); pFrm = aTmp.NextFrm(); - if( pFrm && pFrm->GetRegisteredIn() != this ) + if( pFrm && !pFrm->KnowsFormat(*this) ) { // die Section hat keinen eigenen frame::Frame, also falls // jemand die tatsaechliche Groe?e braucht, so muss das @@ -2542,7 +2582,7 @@ SwRect SwFrmFmt::FindLayoutRect( const sal_Bool bPrtArea, const Point* pPoint, else { sal_uInt16 nFrmType = RES_FLYFRMFMT == Which() ? FRM_FLY : USHRT_MAX; - pFrm = ::GetFrmOfModify( *(SwModify*)this, nFrmType, pPoint, + pFrm = ::GetFrmOfModify( 0, *(SwModify*)this, nFrmType, pPoint, 0, bCalcFrm ); } @@ -2558,8 +2598,7 @@ SwRect SwFrmFmt::FindLayoutRect( const sal_Bool bPrtArea, const Point* pPoint, SwContact* SwFrmFmt::FindContactObj() { - SwClientIter aIter( *this ); - return (SwContact*)aIter.First( TYPE( SwContact ) ); + return SwIterator<SwContact,SwFmt>::FirstElement( *this ); } SdrObject* SwFrmFmt::FindSdrObject() @@ -2576,7 +2615,7 @@ SdrObject* SwFrmFmt::FindRealSdrObject() if( RES_FLYFRMFMT == Which() ) { Point aNullPt; - SwFlyFrm* pFly = (SwFlyFrm*)::GetFrmOfModify( *this, FRM_FLY, + SwFlyFrm* pFly = (SwFlyFrm*)::GetFrmOfModify( 0, *this, FRM_FLY, &aNullPt, 0, sal_False ); return pFly ? pFly->GetVirtDrawObj() : 0; } @@ -2588,12 +2627,10 @@ sal_Bool SwFrmFmt::IsLowerOf( const SwFrmFmt& rFmt ) const { //Auch eine Verkettung von Innen nach aussen oder von aussen //nach innen ist nicht zulaessig. - SwClientIter aIter( *(SwModify*)this ); - SwFlyFrm *pSFly = (SwFlyFrm*)aIter.First( TYPE(SwFlyFrm) ); + SwFlyFrm *pSFly = SwIterator<SwFlyFrm,SwFmt>::FirstElement(*this); if( pSFly ) { - SwClientIter aOtherIter( (SwModify&)rFmt ); - SwFlyFrm *pAskFly = (SwFlyFrm*)aOtherIter.First( TYPE(SwFlyFrm) ); + SwFlyFrm *pAskFly = SwIterator<SwFlyFrm,SwFmt>::FirstElement(rFmt); if( pAskFly ) return pSFly->IsLowerOf( pAskFly ); } @@ -2675,22 +2712,20 @@ IMPL_FIXEDMEMPOOL_NEWDEL( SwFlyFrmFmt, 10, 10 ) SwFlyFrmFmt::~SwFlyFrmFmt() { - SwClientIter aIter( *this ); - SwClient * pLast = aIter.GoStart(); + SwIterator<SwFlyFrm,SwFmt> aIter( *this ); + SwFlyFrm * pLast = aIter.First(); if( pLast ) do { - if ( pLast->ISA( SwFlyFrm ) ) delete pLast; + } while( 0 != ( pLast = aIter.Next() )); - } while( 0 != ( pLast = aIter++ )); - - pLast = aIter.GoStart(); - if( pLast ) + SwIterator<SwFlyDrawContact,SwFmt> a2ndIter( *this ); + SwFlyDrawContact* pC = a2ndIter.First(); + if( pC ) do { - if ( pLast->ISA( SwFlyDrawContact ) ) - delete pLast; + delete pC; - } while( 0 != ( pLast = aIter++ )); + } while( 0 != ( pC = a2ndIter.Next() )); } //Erzeugen der Frms wenn das Format einen Absatzgebundenen Rahmen beschreibt. @@ -2699,8 +2734,8 @@ SwFlyFrmFmt::~SwFlyFrmFmt() void SwFlyFrmFmt::MakeFrms() { // gibts ueberhaupt ein Layout ?? - if( !GetDoc()->GetRootFrm() ) - return; + if( !GetDoc()->GetCurrentViewShell() ) + return; //swmod 071108//swmod 071225 SwModify *pModify = 0; // OD 24.07.2003 #111032# - create local copy of anchor attribute for possible changes. @@ -2733,8 +2768,7 @@ void SwFlyFrmFmt::MakeFrms() if ( pCNd ) // <-- { - SwClientIter aIter( *pCNd ); - if ( aIter.First( TYPE(SwFrm) ) ) + if( SwIterator<SwFrm,SwCntntNode>::FirstElement( *pCNd ) ) { pModify = pCNd; } @@ -2762,17 +2796,15 @@ void SwFlyFrmFmt::MakeFrms() case FLY_AT_PAGE: { sal_uInt16 nPgNum = aAnchorAttr.GetPageNum(); - SwPageFrm *pPage = (SwPageFrm*)GetDoc()->GetRootFrm()->Lower(); + SwPageFrm *pPage = (SwPageFrm*)GetDoc()->GetCurrentLayout()->Lower(); //swmod 080218 if( !nPgNum && aAnchorAttr.GetCntntAnchor() ) { SwCntntNode *pCNd = aAnchorAttr.GetCntntAnchor()->nNode.GetNode().GetCntntNode(); - SwClientIter aIter( *pCNd ); - do + SwIterator<SwFrm,SwCntntNode> aIter( *pCNd ); + for (SwFrm* pFrm = aIter.First(); pFrm; pFrm = aIter.Next() ) { - if( aIter()->ISA( SwFrm ) ) - { - pPage = ((SwFrm*)aIter())->FindPageFrm(); + pPage = pFrm->FindPageFrm(); if( pPage ) { nPgNum = pPage->GetPhyPageNum(); @@ -2783,7 +2815,6 @@ void SwFlyFrmFmt::MakeFrms() } break; } - } while ( aIter++ ); } while ( pPage ) { @@ -2804,10 +2835,8 @@ void SwFlyFrmFmt::MakeFrms() if( pModify ) { - SwClientIter aIter( *pModify ); - for( SwFrm *pFrm = (SwFrm*)aIter.First( TYPE(SwFrm) ); - pFrm; - pFrm = (SwFrm*)aIter.Next() ) + SwIterator<SwFrm,SwModify> aIter( *pModify ); + for( SwFrm *pFrm = aIter.First(); pFrm; pFrm = aIter.Next() ) { sal_Bool bAdd = !pFrm->IsCntntFrm() || !((SwCntntFrm*)pFrm)->IsFollow(); @@ -2856,16 +2885,16 @@ void SwFlyFrmFmt::MakeFrms() switch( aAnchorAttr.GetAnchorId() ) { case FLY_AT_FLY: - pFly = new SwFlyLayFrm( this, pFrm ); + pFly = new SwFlyLayFrm( this, pFrm, pFrm ); break; case FLY_AT_PARA: case FLY_AT_CHAR: - pFly = new SwFlyAtCntFrm( this, pFrm ); + pFly = new SwFlyAtCntFrm( this, pFrm, pFrm ); break; case FLY_AS_CHAR: - pFly = new SwFlyInCntFrm( this, pFrm ); + pFly = new SwFlyInCntFrm( this, pFrm, pFrm ); break; default: OSL_ENSURE( !this, "Neuer Ankertyp" ); @@ -2882,7 +2911,7 @@ void SwFlyFrmFmt::MakeFrms() SwFlyFrm* SwFlyFrmFmt::GetFrm( const Point* pPoint, const sal_Bool bCalcFrm ) const { - return (SwFlyFrm*)::GetFrmOfModify( *(SwModify*)this, FRM_FLY, + return (SwFlyFrm*)::GetFrmOfModify( 0, *(SwModify*)this, FRM_FLY, pPoint, 0, bCalcFrm ); } @@ -2906,8 +2935,7 @@ sal_Bool SwFlyFrmFmt::GetInfo( SfxPoolItem& rInfo ) const { case RES_CONTENT_VISIBLE: { - ((SwPtrMsgPoolItem&)rInfo).pObject = - SwClientIter( *(SwFlyFrmFmt*)this ).First( TYPE(SwFrm) ); + ((SwPtrMsgPoolItem&)rInfo).pObject = SwIterator<SwFrm,SwFmt>::FirstElement( *this ); } return sal_False; @@ -2933,7 +2961,7 @@ void SwFlyFrmFmt::SetObjTitle( const String& rTitle, bool bBroadcast ) SwStringMsgPoolItem aOld( RES_TITLE_CHANGED, pMasterObject->GetTitle() ); SwStringMsgPoolItem aNew( RES_TITLE_CHANGED, rTitle ); pMasterObject->SetTitle( rTitle ); - Modify( &aOld, &aNew ); + ModifyNotification( &aOld, &aNew ); } else { @@ -2969,7 +2997,7 @@ void SwFlyFrmFmt::SetObjDescription( const String& rDescription, bool bBroadcast SwStringMsgPoolItem aOld( RES_DESCRIPTION_CHANGED, pMasterObject->GetDescription() ); SwStringMsgPoolItem aNew( RES_DESCRIPTION_CHANGED, rDescription ); pMasterObject->SetDescription( rDescription ); - Modify( &aOld, &aNew ); + ModifyNotification( &aOld, &aNew ); } else { @@ -3077,33 +3105,32 @@ SwHandleAnchorNodeChg::SwHandleAnchorNodeChg( SwFlyFrmFmt& _rFlyFrmFmt, { // determine 'old' number of anchor frames sal_uInt32 nOldNumOfAnchFrm( 0L ); - SwClientIter aOldIter( *(aOldAnchorFmt.GetCntntAnchor()->nNode.GetNode().GetCntntNode()) ); - for( aOldIter.First( TYPE(SwFrm) ); aOldIter(); aOldIter.Next() ) + SwIterator<SwFrm,SwCntntNode> aOldIter( *(aOldAnchorFmt.GetCntntAnchor()->nNode.GetNode().GetCntntNode()) ); + for( SwFrm* pOld = aOldIter.First(); pOld; pOld = aOldIter.Next() ) { ++nOldNumOfAnchFrm; } // determine 'new' number of anchor frames sal_uInt32 nNewNumOfAnchFrm( 0L ); - SwClientIter aNewIter( *(_rNewAnchorFmt.GetCntntAnchor()->nNode.GetNode().GetCntntNode()) ); - for( aNewIter.First( TYPE(SwFrm) ); aNewIter(); aNewIter.Next() ) + SwIterator<SwFrm,SwCntntNode> aNewIter( *(_rNewAnchorFmt.GetCntntAnchor()->nNode.GetNode().GetCntntNode()) ); + for( SwFrm* pNew = aNewIter.First(); pNew; pNew = aNewIter.Next() ) { ++nNewNumOfAnchFrm; } if ( nOldNumOfAnchFrm != nNewNumOfAnchFrm ) { // delete existing fly frames except <_pKeepThisFlyFrm> - SwClientIter aIter( mrFlyFrmFmt ); - SwClient* pLast = aIter.GoStart(); - if ( pLast ) + SwIterator<SwFrm,SwFmt> aIter( mrFlyFrmFmt ); + SwFrm* pFrm = aIter.First(); + if ( pFrm ) { do { - SwFrm* pFrm( dynamic_cast<SwFrm*>(pLast) ); - if ( pFrm && pFrm != _pKeepThisFlyFrm ) + if ( pFrm != _pKeepThisFlyFrm ) { pFrm->Cut(); delete pFrm; } - } while( 0 != ( pLast = aIter++ )); + } while( 0 != ( pFrm = aIter.Next() )); } // indicate, that re-creation of fly frames necessary mbAnchorNodeChanged = true; @@ -3216,7 +3243,7 @@ IMapObject* SwFrmFmt::GetIMapObject( const Point& rPoint, if( !pFly ) { - pFly = (SwFlyFrm*) SwClientIter( *(SwFrmFmt*)this ).First( TYPE( SwFlyFrm )); + pFly = SwIterator<SwFlyFrm,SwFmt>::FirstElement( *this ); if( !pFly ) return 0; } diff --git a/sw/source/core/layout/calcmove.cxx b/sw/source/core/layout/calcmove.cxx index 8d2cf7625621..e3bcf56ee9c4 100644 --- a/sw/source/core/layout/calcmove.cxx +++ b/sw/source/core/layout/calcmove.cxx @@ -34,6 +34,7 @@ #include "viewsh.hxx" #include "doc.hxx" #include "viewimp.hxx" +#include "viewopt.hxx" #include "swtypes.hxx" #include "dflyobj.hxx" #include "dcontact.hxx" @@ -180,9 +181,9 @@ sal_Bool SwCntntFrm::ShouldBwdMoved( SwLayoutFrm *pNewUpper, sal_Bool, sal_Bool //determine space left in new upper frame nSpace = (aRect.*fnRectX->fnGetHeight)(); - + const ViewShell *pSh = pNewUpper->getRootFrm()->GetCurrShell(); if ( IsInFtn() || - pIDSA->get(IDocumentSettingAccess::BROWSE_MODE) || + (pSh && pSh->GetViewOptions()->getBrowseMode()) || pNewUpper->IsCellFrm() || ( pNewUpper->IsInSct() && ( pNewUpper->IsSctFrm() || ( pNewUpper->IsColBodyFrm() && @@ -733,8 +734,8 @@ void SwPageFrm::MakeAll() pAttrs = pAccess->Get(); } //Bei der BrowseView gelten feste Einstellungen. - ViewShell *pSh = GetShell(); - if ( pSh && GetFmt()->getIDocumentSettingAccess()->get(IDocumentSettingAccess::BROWSE_MODE) ) + ViewShell *pSh = getRootFrm()->GetCurrShell(); + if ( pSh && pSh->GetViewOptions()->getBrowseMode() ) { const Size aBorder = pSh->GetOut()->PixelToLogic( pSh->GetBrowseBorder() ); const long nTop = pAttrs->CalcTopLine() + aBorder.Height(); @@ -958,7 +959,7 @@ bool SwTxtNode::IsCollapse() const // The paragraph is collapsed only if the NdAfter is the end of a cell bool bInTable = this->FindTableNode( ) != NULL; - SwSortedObjs* pObjs = this->GetFrm()->GetDrawObjs( ); + SwSortedObjs* pObjs = this->getLayoutFrm( GetDoc()->GetCurrentLayout() )->GetDrawObjs( ); sal_uInt32 nObjs = ( pObjs != NULL ) ? pObjs->Count( ) : 0; if ( pNdBefore!=NULL && pNdAfter!=NULL && nObjs == 0 && bInTable ) { @@ -1018,11 +1019,11 @@ sal_Bool SwCntntFrm::MakePrtArea( const SwBorderAttrs &rAttrs ) const long nRight = ((SwBorderAttrs&)rAttrs).CalcRight( this ); (this->*fnRect->fnSetXMargins)( nLeft, nRight ); - ViewShell *pSh = GetShell(); + ViewShell *pSh = getRootFrm()->GetCurrShell(); SwTwips nWidthArea; if( pSh && 0!=(nWidthArea=(pSh->VisArea().*fnRect->fnGetWidth)()) && GetUpper()->IsPageBodyFrm() && // nicht dagegen bei BodyFrms in Columns - pSh->getIDocumentSettingAccess()->get(IDocumentSettingAccess::BROWSE_MODE) ) + pSh->GetViewOptions()->getBrowseMode() ) { //Nicht ueber die Kante des sichbaren Bereiches hinausragen. //Die Seite kann breiter sein, weil es Objekte mit "ueberbreite" diff --git a/sw/source/core/layout/colfrm.cxx b/sw/source/core/layout/colfrm.cxx index d4085359819f..5e9aa78fdb59 100644 --- a/sw/source/core/layout/colfrm.cxx +++ b/sw/source/core/layout/colfrm.cxx @@ -46,6 +46,7 @@ #include "bodyfrm.hxx" // ColumnFrms jetzt mit BodyFrm #include "rootfrm.hxx" // wg. RemoveFtns #include "sectfrm.hxx" // wg. FtnAtEnd-Flag +#include "switerator.hxx" // ftnfrm.cxx: void lcl_RemoveFtns( SwFtnBossFrm* pBoss, sal_Bool bPageOnly, sal_Bool bEndNotes ); @@ -56,11 +57,11 @@ void lcl_RemoveFtns( SwFtnBossFrm* pBoss, sal_Bool bPageOnly, sal_Bool bEndNotes |* SwColumnFrm::SwColumnFrm() |* |*************************************************************************/ -SwColumnFrm::SwColumnFrm( SwFrmFmt *pFmt ): - SwFtnBossFrm( pFmt ) +SwColumnFrm::SwColumnFrm( SwFrmFmt *pFmt, SwFrm* pSib ): + SwFtnBossFrm( pFmt, pSib ) { nType = FRMC_COLUMN; - SwBodyFrm* pColBody = new SwBodyFrm( pFmt->GetDoc()->GetDfltFrmFmt() ); + SwBodyFrm* pColBody = new SwBodyFrm( pFmt->GetDoc()->GetDfltFrmFmt(), pSib ); pColBody->InsertBehind( this, 0 ); // ColumnFrms jetzt mit BodyFrm SetMaxFtnHeight( LONG_MAX ); } @@ -138,8 +139,8 @@ static sal_Bool lcl_AddColumns( SwLayoutFrm *pCont, sal_uInt16 nCount ) if ( pCont->IsBodyFrm() ) pAttrOwner = pCont->FindPageFrm(); SwLayoutFrm *pNeighbourCol = 0; - SwClientIter aIter( *pAttrOwner->GetFmt() ); - SwLayoutFrm *pNeighbour = (SwLayoutFrm*)aIter.First( TYPE(SwLayoutFrm) ); + SwIterator<SwLayoutFrm,SwFmt> aIter( *pAttrOwner->GetFmt() ); + SwLayoutFrm *pNeighbour = aIter.First(); sal_uInt16 nAdd = 0; SwFrm *pCol = pCont->Lower(); @@ -152,7 +153,7 @@ static sal_Bool lcl_AddColumns( SwLayoutFrm *pCont, sal_uInt16 nCount ) pNeighbourCol != pCont ) break; pNeighbourCol = 0; - pNeighbour = (SwLayoutFrm*)aIter.Next(); + pNeighbour = aIter.Next(); } sal_Bool bRet; @@ -169,7 +170,7 @@ static sal_Bool lcl_AddColumns( SwLayoutFrm *pCont, sal_uInt16 nCount ) } for ( sal_uInt16 i = 0; i < nCount; ++i ) { - SwColumnFrm *pTmpCol = new SwColumnFrm( pNeighbourCol->GetFmt() ); + SwColumnFrm *pTmpCol = new SwColumnFrm( pNeighbourCol->GetFmt(), pCont ); pTmpCol->SetMaxFtnHeight( nMax ); pTmpCol->InsertBefore( pCont, NULL ); pNeighbourCol = (SwLayoutFrm*)pNeighbourCol->GetNext(); @@ -181,7 +182,7 @@ static sal_Bool lcl_AddColumns( SwLayoutFrm *pCont, sal_uInt16 nCount ) for ( sal_uInt16 i = 0; i < nCount; ++i ) { SwFrmFmt *pFmt = pDoc->MakeFrmFmt( aEmptyStr, pDoc->GetDfltFrmFmt()); - SwColumnFrm *pTmp = new SwColumnFrm( pFmt ); + SwColumnFrm *pTmp = new SwColumnFrm( pFmt, pCont ); pTmp->SetMaxFtnHeight( nMax ); pTmp->Paste( pCont ); } @@ -243,7 +244,7 @@ void SwLayoutFrm::ChgColumns( const SwFmtCol &rOld, const SwFmtCol &rNew, // SaveCntnt wuerde auch den Inhalt der Fussnotencontainer aufsaugen // und im normalen Textfluss unterbringen. if( IsPageBodyFrm() ) - pDoc->GetRootFrm()->RemoveFtns( (SwPageFrm*)GetUpper(), sal_True, sal_False ); + pDoc->GetCurrentLayout()->RemoveFtns( (SwPageFrm*)GetUpper(), sal_True, sal_False ); //swmod 080218 pSave = ::SaveCntnt( this ); //Wenn Spalten existieren, jetzt aber eine Spaltenanzahl von diff --git a/sw/source/core/layout/findfrm.cxx b/sw/source/core/layout/findfrm.cxx index 62f361402055..16bc348b6a42 100644 --- a/sw/source/core/layout/findfrm.cxx +++ b/sw/source/core/layout/findfrm.cxx @@ -48,8 +48,8 @@ #include "ftnfrm.hxx" #include "txtftn.hxx" #include "fmtftn.hxx" -// OD 09.01.2004 #i11859# #include <txtfrm.hxx> // SwTxtFrm +#include <switerator.hxx> /************************************************************************* |* @@ -448,22 +448,6 @@ const SwCntntFrm* SwCntntFrm::ImplGetNextCntntFrm( bool bFwd ) const |* FindPageFrm(), FindColFrm() |* |*************************************************************************/ -SwRootFrm* SwFrm::FindRootFrm() -{ - // MIB: A layout frame is always registerd at a SwFrmFmt and a content - // frame alyways at a SwCntntNode. For any other case we won't find - // a root frame. - // Casting the GetDep() result instead of the frame itself (that has - // been done before) makes it save to use that method in constructors - // and destructors. - OSL_ENSURE( GetDep(), "frame is not registered any longer" ); - OSL_ENSURE( IsLayoutFrm() || IsCntntFrm(), "invalid frame type" ); - SwDoc *pDoc = IsLayoutFrm() - ? static_cast < SwFrmFmt * >( GetDep() )->GetDoc() - : static_cast < SwCntntNode * >( GetDep() )->GetDoc(); - return pDoc->GetRootFrm(); -} - SwPageFrm* SwFrm::FindPageFrm() { SwFrm *pRet = this; @@ -1680,13 +1664,10 @@ const SwCellFrm& SwCellFrm::FindStartEndOfRowSpanCell( bool bStart, bool bCurren GetTabBox()->FindStartOfRowSpan( *pTable, nMax ) : GetTabBox()->FindEndOfRowSpan( *pTable, nMax ); - SwClientIter aIter( const_cast<SwFrmFmt&>( *rMasterBox.GetFrmFmt()) ); + SwIterator<SwCellFrm,SwFmt> aIter( *rMasterBox.GetFrmFmt() ); - for ( SwClient* pLast = aIter.First( TYPE( SwFrm ) ); pLast; pLast = aIter.Next() ) + for ( SwCellFrm* pMasterCell = aIter.First(); pMasterCell; pMasterCell = aIter.Next() ) { - OSL_ENSURE( ((SwFrm*)pLast)->IsCellFrm(), "Non-row frame registered in table line" ); - const SwCellFrm* pMasterCell = static_cast<const SwCellFrm*>(pLast); - if ( pMasterCell->GetTabBox() == &rMasterBox ) { const SwTabFrm* pMasterTable = static_cast<const SwTabFrm*>(pMasterCell->GetUpper()->GetUpper()); diff --git a/sw/source/core/layout/flowfrm.cxx b/sw/source/core/layout/flowfrm.cxx index 5539e8158761..59fac2138f1d 100644 --- a/sw/source/core/layout/flowfrm.cxx +++ b/sw/source/core/layout/flowfrm.cxx @@ -31,11 +31,13 @@ #include "pam.hxx" #include "swtable.hxx" #include "frame.hxx" +#include "rootfrm.hxx" #include "pagefrm.hxx" #include "flyfrm.hxx" #include "viewsh.hxx" #include "doc.hxx" #include "viewimp.hxx" +#include "viewopt.hxx" #include "dflyobj.hxx" #include "frmtool.hxx" #include "dcontact.hxx" @@ -50,7 +52,6 @@ #include <fmtftn.hxx> #include <editeng/pgrditem.hxx> #include <paratr.hxx> - #include "ftnfrm.hxx" #include "txtfrm.hxx" #include "tabfrm.hxx" @@ -62,15 +63,11 @@ #include "section.hxx" #include "dbg_lay.hxx" #include "lineinfo.hxx" -// OD 2004-03-02 #106629# #include <fmtclbl.hxx> -// --> OD 2004-06-23 #i28701# #include <sortedobjs.hxx> #include <layouter.hxx> -// <-- -// --> OD 2004-10-15 #i26945# #include <fmtfollowtextflow.hxx> -// <-- +#include <switerator.hxx> sal_Bool SwFlowFrm::bMoveBwdJump = sal_False; @@ -587,7 +584,7 @@ void SwFlowFrm::MoveSubTree( SwLayoutFrm* pParent, SwFrm* pSibling ) OSL_ENSURE( rThis.GetUpper(), "Wo kommen wir denn her?" ); //Sparsamer benachrichtigen wenn eine Action laeuft. - ViewShell *pSh = rThis.GetShell(); + ViewShell *pSh = rThis.getRootFrm()->GetCurrShell(); const SwViewImp *pImp = pSh ? pSh->Imp() : 0; const sal_Bool bComplete = pImp && pImp->IsAction() && pImp->GetLayAction().IsComplete(); @@ -714,20 +711,13 @@ SwSectionFrm* SwSectionFrm::FindMaster() const { OSL_ENSURE( IsFollow(), "SwSectionFrm::FindMaster(): !IsFollow" ); - SwClientIter aIter( *pSection->GetFmt() ); - SwClient *pLast = aIter.GoStart(); - - while ( pLast ) + SwIterator<SwSectionFrm,SwFmt> aIter( *pSection->GetFmt() ); + SwSectionFrm* pSect = aIter.First(); + while ( pSect ) { - if ( pLast->ISA( SwFrm ) ) - { - OSL_ENSURE( ((SwFrm*)pLast)->IsSctFrm(), - "Non-section frame registered in section format" ); - SwSectionFrm* pSect = (SwSectionFrm*)pLast; if( pSect->GetFollow() == this ) return pSect; - } - pLast = aIter++; + pSect = aIter.Next(); } OSL_FAIL( "Follow ist lost in Space." ); @@ -738,17 +728,10 @@ SwTabFrm* SwTabFrm::FindMaster( bool bFirstMaster ) const { OSL_ENSURE( IsFollow(), "SwTabFrm::FindMaster(): !IsFollow" ); - SwClientIter aIter( *GetTable()->GetFrmFmt() ); - SwClient* pLast = aIter.GoStart(); - - while ( pLast ) + SwIterator<SwTabFrm,SwFmt> aIter( *GetTable()->GetFrmFmt() ); + SwTabFrm* pTab = aIter.First(); + while ( pTab ) { - if ( pLast->ISA( SwFrm ) ) - { - OSL_ENSURE( ((SwFrm*)pLast)->IsTabFrm(), - "Non-table frame registered in table format" ); - SwTabFrm* pTab = (SwTabFrm*)pLast; - if ( bFirstMaster ) { // @@ -772,8 +755,8 @@ SwTabFrm* SwTabFrm::FindMaster( bool bFirstMaster ) const if ( pTab->GetFollow() == this ) return pTab; } - } - pLast = aIter++; + + pTab = aIter.Next(); } OSL_FAIL( "Follow ist lost in Space." ); @@ -1011,12 +994,13 @@ SwLayoutFrm *SwFrm::GetNextLeaf( MakePageType eMakePage ) return pLayLeaf; SwPageFrm *pNew = pLayLeaf->FindPageFrm(); + const ViewShell *pSh = getRootFrm()->GetCurrShell(); // #111704# The pagedesc check does not make sense for frames in fly frames if ( pNew != FindPageFrm() && !bNewPg && !IsInFly() && // --> FME 2005-05-10 #i46683# // Do not consider page descriptions in browse mode (since // MoveBwd ignored them) - !pNew->GetFmt()->getIDocumentSettingAccess()->get(IDocumentSettingAccess::BROWSE_MODE) ) + !(pSh && pSh->GetViewOptions()->getBrowseMode() ) ) // <-- { if( WrongPageDesc( pNew ) ) @@ -1137,7 +1121,8 @@ sal_Bool SwFlowFrm::IsPrevObjMove() const // und fuer diesen ggf. Umbrechen. //!!!!!!!!!!!Hack!!!!!!!!!!! - if ( rThis.GetUpper()->GetFmt()->getIDocumentSettingAccess()->get(IDocumentSettingAccess::BROWSE_MODE) ) + const ViewShell *pSh = rThis.getRootFrm()->GetCurrShell(); + if( pSh && pSh->GetViewOptions()->getBrowseMode() ) return sal_False; SwFrm *pPre = rThis.FindPrev(); @@ -1214,9 +1199,11 @@ sal_Bool SwFlowFrm::IsPrevObjMove() const sal_Bool SwFlowFrm::IsPageBreak( sal_Bool bAct ) const { if ( !IsFollow() && rThis.IsInDocBody() && - ( !rThis.IsInTab() || ( rThis.IsTabFrm() && !rThis.GetUpper()->IsInTab() ) ) && // i66968 - !rThis.GetUpper()->GetFmt()->getIDocumentSettingAccess()->get(IDocumentSettingAccess::BROWSE_MODE) ) + ( !rThis.IsInTab() || ( rThis.IsTabFrm() && !rThis.GetUpper()->IsInTab() ) ) ) // i66968 { + const ViewShell *pSh = rThis.getRootFrm()->GetCurrShell(); + if( pSh && pSh->GetViewOptions()->getBrowseMode() ) + return sal_False; const SwAttrSet *pSet = rThis.GetAttrSet(); //Vorgaenger ermitteln @@ -2064,7 +2051,7 @@ sal_Bool SwFlowFrm::MoveFwd( sal_Bool bMakePage, sal_Bool bPageBreak, sal_Bool b rThis.Prepare( PREP_BOSS_CHGD, 0, sal_False ); if( !bSamePage ) { - ViewShell *pSh = rThis.GetShell(); + ViewShell *pSh = rThis.getRootFrm()->GetCurrShell(); if ( pSh && !pSh->Imp()->IsUpdateExpFlds() ) pSh->GetDoc()->SetNewFldLst(true); //Wird von CalcLayout() hinterher erledigt! @@ -2076,7 +2063,9 @@ sal_Bool SwFlowFrm::MoveFwd( sal_Bool bMakePage, sal_Bool bPageBreak, sal_Bool b } } // OD 30.10.2002 #97265# - no <CheckPageDesc(..)> in online layout - if ( !pNewPage->GetFmt()->getIDocumentSettingAccess()->get(IDocumentSettingAccess::BROWSE_MODE) ) + const ViewShell *pSh = rThis.getRootFrm()->GetCurrShell(); + + if ( !( pSh && pSh->GetViewOptions()->getBrowseMode() ) ) { // --> OD 2009-12-31 #i106452# // check page description not only in situation with sections. @@ -2541,7 +2530,7 @@ sal_Bool SwFlowFrm::MoveBwd( sal_Bool &rbReformat ) { //Kann sein, dass ich einen Container bekam. SwFtnFrm *pOld = rThis.FindFtnFrm(); - SwFtnFrm *pNew = new SwFtnFrm( pOld->GetFmt(), + SwFtnFrm *pNew = new SwFtnFrm( pOld->GetFmt(), pOld, pOld->GetRef(), pOld->GetAttr() ); if ( pOld->GetMaster() ) { @@ -2622,7 +2611,7 @@ sal_Bool SwFlowFrm::MoveBwd( sal_Bool &rbReformat ) if( pNewPage != pOldPage ) { rThis.Prepare( PREP_BOSS_CHGD, (const void*)pOldPage, sal_False ); - ViewShell *pSh = rThis.GetShell(); + ViewShell *pSh = rThis.getRootFrm()->GetCurrShell(); if ( pSh && !pSh->Imp()->IsUpdateExpFlds() ) pSh->GetDoc()->SetNewFldLst(true); //Wird von CalcLayout() hinterher eledigt! @@ -2632,7 +2621,7 @@ sal_Bool SwFlowFrm::MoveBwd( sal_Bool &rbReformat ) pNewPage->InvalidateWordCount(); // OD 30.10.2002 #97265# - no <CheckPageDesc(..)> in online layout - if ( !pNewPage->GetFmt()->getIDocumentSettingAccess()->get(IDocumentSettingAccess::BROWSE_MODE) ) + if ( !( pSh && pSh->GetViewOptions()->getBrowseMode() ) ) { if ( bCheckPageDescs && pNewPage->GetNext() ) { diff --git a/sw/source/core/layout/fly.cxx b/sw/source/core/layout/fly.cxx index 41d5a33e86c4..6d429dd0639d 100644 --- a/sw/source/core/layout/fly.cxx +++ b/sw/source/core/layout/fly.cxx @@ -51,27 +51,16 @@ #include <fmtcnct.hxx> #include <layhelp.hxx> #include <ndtxt.hxx> - -// --> OD 2010-09-14 #i113730# #include <svx/svdogrp.hxx> -// <-- -// OD 16.04.2003 #i13147# - for <SwFlyFrm::GetContour(..)> #include <ndgrf.hxx> -// OD 29.10.2003 #113049# #include <tolayoutanchoredobjectposition.hxx> -// OD 06.11.2003 #i22305# #include <fmtfollowtextflow.hxx> -// --> OD 2004-06-28 #i28701# #include <sortedobjs.hxx> #include <objectformatter.hxx> -// <-- -// OD 2004-04-06 #i26791# #include <anchoredobject.hxx> -// --> OD 2006-01-31 #i53298# #include <ndole.hxx> -// <-- #include <swtable.hxx> - +#include <svx/svdpage.hxx> #include "doc.hxx" #include "viewsh.hxx" #include "layouter.hxx" @@ -81,6 +70,7 @@ #include "pam.hxx" #include "frmatr.hxx" #include "viewimp.hxx" +#include "viewopt.hxx" #include "dcontact.hxx" #include "dflyobj.hxx" #include "dview.hxx" @@ -98,6 +88,7 @@ #include "sectfrm.hxx" #include <vcl/svapp.hxx> #include <vcl/salbtype.hxx> // FRound +#include "switerator.hxx" using namespace ::com::sun::star; @@ -111,8 +102,8 @@ TYPEINIT2(SwFlyFrm,SwLayoutFrm,SwAnchoredObject); |* |*************************************************************************/ -SwFlyFrm::SwFlyFrm( SwFlyFrmFmt *pFmt, SwFrm *pAnch ) : - SwLayoutFrm( pFmt ), +SwFlyFrm::SwFlyFrm( SwFlyFrmFmt *pFmt, SwFrm* pSib, SwFrm *pAnch ) : + SwLayoutFrm( pFmt, pSib ), // OD 2004-03-22 #i26791# SwAnchoredObject(), // OD 2004-05-27 #i26791# - moved to <SwAnchoredObject> @@ -149,21 +140,30 @@ SwFlyFrm::SwFlyFrm( SwFlyFrmFmt *pFmt, SwFrm *pAnch ) : bInvalidVert = 0; bDerivedVert = 0; bDerivedR2L = 0; - if( FRMDIR_HORI_LEFT_TOP == nDir || FRMDIR_HORI_RIGHT_TOP == nDir - || pFmt->getIDocumentSettingAccess()->get(IDocumentSettingAccess::BROWSE_MODE) ) - //Badaa: 2008-04-18 * Support for Classical Mongolian Script (SCMS) joint with Jiayanmin + if( FRMDIR_HORI_LEFT_TOP == nDir || FRMDIR_HORI_RIGHT_TOP == nDir ) { - bVertical = 0; + //Badaa: 2008-04-18 * Support for Classical Mongolian Script (SCMS) joint with Jiayanmin bVertLR = 0; + bVertical = 0; } else - //Badaa: 2008-04-18 * Support for Classical Mongolian Script (SCMS) joint with Jiayanmin { - bVertical = 1; - if ( FRMDIR_VERT_TOP_LEFT == nDir ) - bVertLR = 1; - else + const ViewShell *pSh = getRootFrm() ? getRootFrm()->GetCurrShell() : 0; + if( pSh && pSh->GetViewOptions()->getBrowseMode() ) + { + //Badaa: 2008-04-18 * Support for Classical Mongolian Script (SCMS) joint with Jiayanmin bVertLR = 0; + bVertical = 0; + } + else + { + bVertical = 1; + //Badaa: 2008-04-18 * Support for Classical Mongolian Script (SCMS) joint with Jiayanmin + if ( FRMDIR_VERT_TOP_LEFT == nDir ) + bVertLR = 1; + else + bVertLR = 0; + } } bVert = bVertical; @@ -297,7 +297,7 @@ SwFlyFrm::~SwFlyFrm() // anchor will do that. if( IsAccessibleFrm() && GetFmt() && (IsFlyInCntFrm() || !GetAnchorFrm()) ) { - SwRootFrm *pRootFrm = FindRootFrm(); + SwRootFrm *pRootFrm = getRootFrm(); if( pRootFrm && pRootFrm->IsAnyShellAccessible() ) { ViewShell *pVSh = pRootFrm->GetCurrShell(); @@ -385,15 +385,81 @@ void SwFlyFrm::DeleteCnt() |* SwFlyFrm::InitDrawObj() |* |*************************************************************************/ + +sal_uInt32 SwFlyFrm::_GetOrdNumForNewRef( const SwFlyDrawContact* pContact ) +{ + sal_uInt32 nOrdNum( 0L ); + + // search for another Writer fly frame registered at same frame format + SwIterator<SwFlyFrm,SwFmt> aIter( *pContact->GetFmt() ); + const SwFlyFrm* pFlyFrm( 0L ); + for ( pFlyFrm = aIter.First(); pFlyFrm; pFlyFrm = aIter.Next() ) + { + if ( pFlyFrm != this ) + { + break; + } + } + + if ( pFlyFrm ) + { + // another Writer fly frame found. Take its order number + nOrdNum = pFlyFrm->GetVirtDrawObj()->GetOrdNum(); + } + else + { + // no other Writer fly frame found. Take order number of 'master' object + // --> OD 2004-11-11 #i35748# - use method <GetOrdNumDirect()> instead + // of method <GetOrdNum()> to avoid a recalculation of the order number, + // which isn't intended. + nOrdNum = pContact->GetMaster()->GetOrdNumDirect(); + // <-- + } + + return nOrdNum; +} + +SwVirtFlyDrawObj* SwFlyFrm::CreateNewRef( SwFlyDrawContact *pContact ) +{ + SwVirtFlyDrawObj *pDrawObj = new SwVirtFlyDrawObj( *pContact->GetMaster(), this ); + pDrawObj->SetModel( pContact->GetMaster()->GetModel() ); + pDrawObj->SetUserCall( pContact ); + + //Der Reader erzeugt die Master und setzt diese, um die Z-Order zu + //transportieren, in die Page ein. Beim erzeugen der ersten Referenz werden + //die Master aus der Liste entfernt und fuehren von da an ein + //Schattendasein. + SdrPage* pPg( 0L ); + if ( 0 != ( pPg = pContact->GetMaster()->GetPage() ) ) + { + const sal_uInt32 nOrdNum = pContact->GetMaster()->GetOrdNum(); + pPg->ReplaceObject( pDrawObj, nOrdNum ); + } + // --> OD 2004-08-16 #i27030# - insert new <SwVirtFlyDrawObj> instance + // into drawing page with correct order number + else + { + pContact->GetFmt()->getIDocumentDrawModelAccess()->GetDrawModel()->GetPage( 0 )-> + InsertObject( pDrawObj, _GetOrdNumForNewRef( pContact ) ); + } + // <-- + // --> OD 2004-12-13 #i38889# - assure, that new <SwVirtFlyDrawObj> instance + // is in a visible layer. + pContact->MoveObjToVisibleLayer( pDrawObj ); + // <-- + return pDrawObj; +} + + + void SwFlyFrm::InitDrawObj( sal_Bool bNotify ) { //ContactObject aus dem Format suchen. Wenn bereits eines existiert, so //braucht nur eine neue Ref erzeugt werden, anderfalls ist es jetzt an //der Zeit das Contact zu erzeugen. - SwClientIter aIter( *GetFmt() ); - SwFlyDrawContact *pContact = (SwFlyDrawContact*) - aIter.First( TYPE(SwFlyDrawContact) ); + IDocumentDrawModelAccess* pIDDMA = GetFmt()->getIDocumentDrawModelAccess(); + SwFlyDrawContact *pContact = SwIterator<SwFlyDrawContact,SwFmt>::FirstElement( *GetFmt() ); if ( !pContact ) { // --> OD 2005-08-08 #i52858# - method name changed @@ -403,7 +469,7 @@ void SwFlyFrm::InitDrawObj( sal_Bool bNotify ) } OSL_ENSURE( pContact, "InitDrawObj failed" ); // OD 2004-03-22 #i26791# - SetDrawObj( *(pContact->CreateNewRef( this )) ); + SetDrawObj( *(CreateNewRef( pContact )) ); //Den richtigen Layer setzen. // OD 2004-01-19 #110582# @@ -431,7 +497,7 @@ void SwFlyFrm::FinitDrawObj() //Bei den SdrPageViews abmelden falls das Objekt dort noch selektiert ist. if ( !GetFmt()->GetDoc()->IsInDtor() ) { - ViewShell *p1St = GetShell(); + ViewShell *p1St = getRootFrm()->GetCurrShell(); if ( p1St ) { ViewShell *pSh = p1St; @@ -452,18 +518,19 @@ void SwFlyFrm::FinitDrawObj() SwFlyDrawContact *pMyContact = 0; if ( GetFmt() ) { - SwClientIter aIter( *GetFmt() ); - aIter.GoStart(); - do { - if ( aIter()->ISA(SwFrm) && (SwFrm*)aIter() != this ) + bool bContinue = true; + SwIterator<SwFrm,SwFmt> aFrmIter( *GetFmt() ); + for ( SwFrm* pFrm = aFrmIter.First(); pFrm; pFrm = aFrmIter.Next() ) + if ( pFrm != this ) { - pMyContact = 0; + // don't delete Contact if there is still a Frm + bContinue = false; break; } - if( !pMyContact && aIter()->ISA(SwFlyDrawContact) ) - pMyContact = (SwFlyDrawContact*)aIter(); - aIter++; - } while( aIter() ); + + if ( bContinue ) + // no Frm left, find Contact object to destroy + pMyContact = SwIterator<SwFlyDrawContact,SwFmt>::FirstElement( *GetFmt() ); } // OD, OS 2004-03-31 #116203# - clear user call of Writer fly frame 'master' @@ -524,10 +591,13 @@ void SwFlyFrm::ChainFrames( SwFlyFrm *pMaster, SwFlyFrm *pFollow ) } // invalidate accessible relation set (accessibility wrapper) - ViewShell* pSh = pMaster->GetShell(); - if( pSh && pSh->GetLayout()->IsAnyShellAccessible() ) + ViewShell* pSh = pMaster->getRootFrm()->GetCurrShell(); + if( pSh ) + { + SwRootFrm* pLayout = pMaster->getRootFrm(); + if( pLayout && pLayout->IsAnyShellAccessible() ) pSh->Imp()->InvalidateAccessibleRelationSet( pMaster, pFollow ); - + } } void SwFlyFrm::UnchainFrames( SwFlyFrm *pMaster, SwFlyFrm *pFollow ) @@ -567,10 +637,14 @@ void SwFlyFrm::UnchainFrames( SwFlyFrm *pMaster, SwFlyFrm *pFollow ) pFollow->GetFmt()->GetDoc(), ++nIndex ); // invalidate accessible relation set (accessibility wrapper) - ViewShell* pSh = pMaster->GetShell(); - if( pSh && pSh->GetLayout()->IsAnyShellAccessible() ) + ViewShell* pSh = pMaster->getRootFrm()->GetCurrShell(); + if( pSh ) + { + SwRootFrm* pLayout = pMaster->getRootFrm(); + if( pLayout && pLayout->IsAnyShellAccessible() ) pSh->Imp()->InvalidateAccessibleRelationSet( pMaster, pFollow ); } +} /************************************************************************* |* @@ -598,8 +672,8 @@ SwFlyFrm *SwFlyFrm::FindChainNeighbour( SwFrmFmt &rChain, SwFrm *pAnch ) pLay = pLay->GetUpper(); } - SwClientIter aIter( rChain ); - SwFlyFrm *pFly = (SwFlyFrm*)aIter.First( TYPE(SwFlyFrm ) ); + SwIterator<SwFlyFrm,SwFmt> aIter( rChain ); + SwFlyFrm *pFly = aIter.First(); if ( pLay ) { while ( pFly ) @@ -614,7 +688,7 @@ SwFlyFrm *SwFlyFrm::FindChainNeighbour( SwFrmFmt &rChain, SwFrm *pAnch ) else if ( pLay == pFly->FindFooterOrHeader() ) break; } - pFly = (SwFlyFrm*)aIter.Next(); + pFly = aIter.Next(); } } else if ( pFly ) @@ -708,7 +782,7 @@ sal_Bool SwFlyFrm::FrmSizeChg( const SwFmtFrmSize &rFrmSize ) |* |*************************************************************************/ -void SwFlyFrm::Modify( SfxPoolItem * pOld, SfxPoolItem * pNew ) +void SwFlyFrm::Modify( const SfxPoolItem* pOld, const SfxPoolItem * pNew ) { sal_uInt8 nInvFlags = 0; @@ -760,7 +834,7 @@ void SwFlyFrm::Modify( SfxPoolItem * pOld, SfxPoolItem * pNew ) if ( ( nInvFlags & 0x40 ) && Lower() && Lower()->IsNoTxtFrm() ) ClrContourCache( GetVirtDrawObj() ); SwRootFrm *pRoot; - if ( nInvFlags & 0x20 && 0 != (pRoot = FindRootFrm()) ) + if ( nInvFlags & 0x20 && 0 != (pRoot = getRootFrm()) ) pRoot->InvalidateBrowseWidth(); // --> OD 2004-06-28 #i28701# if ( nInvFlags & 0x80 ) @@ -776,13 +850,13 @@ void SwFlyFrm::Modify( SfxPoolItem * pOld, SfxPoolItem * pNew ) // <-- } -void SwFlyFrm::_UpdateAttr( SfxPoolItem *pOld, SfxPoolItem *pNew, +void SwFlyFrm::_UpdateAttr( const SfxPoolItem *pOld, const SfxPoolItem *pNew, sal_uInt8 &rInvFlags, SwAttrSetChg *pOldSet, SwAttrSetChg *pNewSet ) { sal_Bool bClear = sal_True; const sal_uInt16 nWhich = pOld ? pOld->Which() : pNew ? pNew->Which() : 0; - ViewShell *pSh = GetShell(); + ViewShell *pSh = getRootFrm()->GetCurrShell(); switch( nWhich ) { case RES_VERT_ORIENT: @@ -834,8 +908,12 @@ void SwFlyFrm::_UpdateAttr( SfxPoolItem *pOld, SfxPoolItem *pNew, const SvxProtectItem *pP = (SvxProtectItem*)pNew; GetVirtDrawObj()->SetMoveProtect( pP->IsPosProtected() ); GetVirtDrawObj()->SetResizeProtect( pP->IsSizeProtected() ); - if( pSh && pSh->GetLayout()->IsAnyShellAccessible() ) + if( pSh ) + { + SwRootFrm* pLayout = getRootFrm(); + if( pLayout && pLayout->IsAnyShellAccessible() ) pSh->Imp()->InvalidateAccessibleEditableState( sal_True, this ); + } break; } @@ -946,8 +1024,8 @@ void SwFlyFrm::_UpdateAttr( SfxPoolItem *pOld, SfxPoolItem *pNew, case RES_LR_SPACE: { rInvFlags |= 0x41; - if ( GetFmt()->getIDocumentSettingAccess()->get(IDocumentSettingAccess::BROWSE_MODE) ) - GetFmt()->GetDoc()->GetRootFrm()->InvalidateBrowseWidth(); + if( pSh && pSh->GetViewOptions()->getBrowseMode() ) + getRootFrm()->InvalidateBrowseWidth(); SwRect aNew( GetObjRectWithSpaces() ); SwRect aOld( aFrm ); if ( RES_UL_SPACE == nWhich ) @@ -988,11 +1066,15 @@ void SwFlyFrm::_UpdateAttr( SfxPoolItem *pOld, SfxPoolItem *pNew, pIDDMA->GetHeavenId() : pIDDMA->GetHellId(); GetVirtDrawObj()->SetLayer( nId ); - if( pSh && pSh->GetLayout()->IsAnyShellAccessible() ) + if( pSh ) + { + SwRootFrm* pLayout = getRootFrm(); + if( pLayout && pLayout->IsAnyShellAccessible() ) { pSh->Imp()->DisposeAccessibleFrm( this ); pSh->Imp()->AddAccessibleFrm( this ); } + } // --> OD 2004-06-28 #i28701# - perform reorder of object lists // at anchor frame and at page frame. rInvFlags |= 0x80; @@ -2152,7 +2234,7 @@ void SwFrm::RemoveFly( SwFlyFrm *pToRemove ) pToRemove->GetFmt() && !pToRemove->IsFlyInCntFrm() ) { - SwRootFrm *pRootFrm = FindRootFrm(); + SwRootFrm *pRootFrm = getRootFrm(); if( pRootFrm && pRootFrm->IsAnyShellAccessible() ) { ViewShell *pVSh = pRootFrm->GetCurrShell(); @@ -2242,9 +2324,11 @@ void SwFrm::AppendDrawObj( SwAnchoredObject& _rNewObj ) } // Notify accessible layout. - ViewShell* pSh = GetShell(); - if( pSh && pSh->GetLayout()->IsAnyShellAccessible() ) + ViewShell* pSh = getRootFrm()->GetCurrShell(); + if( pSh ) { + SwRootFrm* pLayout = getRootFrm(); + if( pLayout && pLayout->IsAnyShellAccessible() ) pSh->Imp()->AddAccessibleObj( _rNewObj.GetDrawObj() ); } } @@ -2252,9 +2336,11 @@ void SwFrm::AppendDrawObj( SwAnchoredObject& _rNewObj ) void SwFrm::RemoveDrawObj( SwAnchoredObject& _rToRemoveObj ) { // Notify accessible layout. - ViewShell* pSh = GetShell(); - if( pSh && pSh->GetLayout()->IsAnyShellAccessible() ) + ViewShell* pSh = getRootFrm()->GetCurrShell(); + if( pSh ) { + SwRootFrm* pLayout = getRootFrm(); + if( pLayout && pLayout->IsAnyShellAccessible() ) pSh->Imp()->DisposeAccessibleObj( _rToRemoveObj.GetDrawObj() ); } @@ -2465,10 +2551,10 @@ Size SwFlyFrm::CalcRel( const SwFmtFrmSize &rSz ) const if( pRel ) // LAYER_IMPL { long nRelWidth = LONG_MAX, nRelHeight = LONG_MAX; - const ViewShell *pSh = GetShell(); + const ViewShell *pSh = getRootFrm()->GetCurrShell(); if ( ( pRel->IsBodyFrm() || pRel->IsPageFrm() ) && - GetFmt()->getIDocumentSettingAccess()->get(IDocumentSettingAccess::BROWSE_MODE) && - pSh && pSh->VisArea().HasArea() ) + pSh && pSh->GetViewOptions()->getBrowseMode() && + pSh->VisArea().HasArea() ) { nRelWidth = pSh->GetBrowseWidth(); nRelHeight = pSh->VisArea().Height(); @@ -2771,6 +2857,13 @@ bool SwFlyFrm::IsFormatPossible() const !IsLocked() && !IsColLocked(); } +void SwFlyFrm::GetAnchoredObjects( std::list<SwAnchoredObject*>& aList, const SwFmt& rFmt ) +{ + SwIterator<SwFlyFrm,SwFmt> aIter( rFmt ); + for( SwFlyFrm* pFlyFrm = aIter.First(); pFlyFrm; pFlyFrm = aIter.Next() ) + aList.push_back( pFlyFrm ); +} + const SwFlyFrmFmt * SwFlyFrm::GetFmt() const { return static_cast< const SwFlyFrmFmt * >( GetDep() ); diff --git a/sw/source/core/layout/flycnt.cxx b/sw/source/core/layout/flycnt.cxx index a25ce1dccb14..7db5677f7403 100644 --- a/sw/source/core/layout/flycnt.cxx +++ b/sw/source/core/layout/flycnt.cxx @@ -31,7 +31,6 @@ #include <tools/bigint.hxx> #include "pagefrm.hxx" -#include "rootfrm.hxx" #include "cntfrm.hxx" #include "flyfrm.hxx" #include "txtfrm.hxx" @@ -74,8 +73,8 @@ using namespace ::com::sun::star; |* |*************************************************************************/ -SwFlyAtCntFrm::SwFlyAtCntFrm( SwFlyFrmFmt *pFmt, SwFrm *pAnch ) : - SwFlyFreeFrm( pFmt, pAnch ) +SwFlyAtCntFrm::SwFlyAtCntFrm( SwFlyFrmFmt *pFmt, SwFrm* pSib, SwFrm *pAnch ) : + SwFlyFreeFrm( pFmt, pSib, pAnch ) { bAtCnt = sal_True; bAutoPosition = (FLY_AT_CHAR == pFmt->GetAnchor().GetAnchorId()); @@ -89,7 +88,7 @@ TYPEINIT1(SwFlyAtCntFrm,SwFlyFreeFrm); |* |*************************************************************************/ -void SwFlyAtCntFrm::Modify( SfxPoolItem *pOld, SfxPoolItem *pNew ) +void SwFlyAtCntFrm::Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew ) { sal_uInt16 nWhich = pNew ? pNew->Which() : 0; const SwFmtAnchor *pAnch = 0; @@ -176,7 +175,7 @@ void SwFlyAtCntFrm::Modify( SfxPoolItem *pOld, SfxPoolItem *pNew ) if ( !pCntnt ) { SwCntntNode *pNode = aNewIdx.GetNode().GetCntntNode(); - pCntnt = pNode->GetFrm( &pOldAnchor->Frm().Pos(), 0, sal_False ); + pCntnt = pNode->getLayoutFrm( getRootFrm(), &pOldAnchor->Frm().Pos(), 0, sal_False ); OSL_ENSURE( pCntnt, "Neuen Anker nicht gefunden" ); } //Flys haengen niemals an einem Follow sondern immer am diff --git a/sw/source/core/layout/flyincnt.cxx b/sw/source/core/layout/flyincnt.cxx index 51df36b56ff9..3a84f4948758 100644 --- a/sw/source/core/layout/flyincnt.cxx +++ b/sw/source/core/layout/flyincnt.cxx @@ -50,8 +50,8 @@ void DeepCalc( const SwFrm *pFrm ); |* SwFlyInCntFrm::SwFlyInCntFrm(), ~SwFlyInCntFrm() |* |*************************************************************************/ -SwFlyInCntFrm::SwFlyInCntFrm( SwFlyFrmFmt *pFmt, SwFrm *pAnch ) : - SwFlyFrm( pFmt, pAnch ) +SwFlyInCntFrm::SwFlyInCntFrm( SwFlyFrmFmt *pFmt, SwFrm* pSib, SwFrm *pAnch ) : + SwFlyFrm( pFmt, pSib, pAnch ) { bInCnt = bInvalidLayout = bInvalidCntnt = sal_True; SwTwips nRel = pFmt->GetVertOrient().GetPos(); @@ -115,7 +115,7 @@ void SwFlyInCntFrm::SetRefPoint( const Point& rPoint, |* SwFlyInCntFrm::Modify() |* |*************************************************************************/ -void SwFlyInCntFrm::Modify( SfxPoolItem *pOld, SfxPoolItem *pNew ) +void SwFlyInCntFrm::Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew ) { sal_Bool bCallPrepare = sal_False; sal_uInt16 nWhich = pOld ? pOld->Which() : pNew ? pNew->Which() : 0; diff --git a/sw/source/core/layout/flylay.cxx b/sw/source/core/layout/flylay.cxx index 2d452e0771c2..170779683097 100644 --- a/sw/source/core/layout/flylay.cxx +++ b/sw/source/core/layout/flylay.cxx @@ -70,8 +70,8 @@ using namespace ::com::sun::star; |* |*************************************************************************/ -SwFlyFreeFrm::SwFlyFreeFrm( SwFlyFrmFmt *pFmt, SwFrm *pAnch ) : - SwFlyFrm( pFmt, pAnch ), +SwFlyFreeFrm::SwFlyFreeFrm( SwFlyFrmFmt *pFmt, SwFrm* pSib, SwFrm *pAnch ) : + SwFlyFrm( pFmt, pSib, pAnch ), pPage( 0 ), // #i34753# mbNoMakePos( false ), @@ -505,8 +505,8 @@ bool SwFlyFreeFrm::IsFormatPossible() const |* |*************************************************************************/ -SwFlyLayFrm::SwFlyLayFrm( SwFlyFrmFmt *pFmt, SwFrm *pAnch ) : - SwFlyFreeFrm( pFmt, pAnch ) +SwFlyLayFrm::SwFlyLayFrm( SwFlyFrmFmt *pFmt, SwFrm* pSib, SwFrm *pAnch ) : + SwFlyFreeFrm( pFmt, pSib, pAnch ) { bLayout = sal_True; } @@ -519,7 +519,7 @@ TYPEINIT1(SwFlyLayFrm,SwFlyFreeFrm); |* |*************************************************************************/ -void SwFlyLayFrm::Modify( SfxPoolItem *pOld, SfxPoolItem *pNew ) +void SwFlyLayFrm::Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew ) { sal_uInt16 nWhich = pNew ? pNew->Which() : 0; @@ -553,7 +553,7 @@ void SwFlyLayFrm::Modify( SfxPoolItem *pOld, SfxPoolItem *pNew ) if ( FLY_AT_PAGE == pAnch->GetAnchorId() ) { sal_uInt16 nPgNum = pAnch->GetPageNum(); - SwRootFrm *pRoot = FindRootFrm(); + SwRootFrm *pRoot = getRootFrm(); SwPageFrm *pTmpPage = (SwPageFrm*)pRoot->Lower(); for ( sal_uInt16 i = 1; (i <= nPgNum) && pTmpPage; ++i, pTmpPage = (SwPageFrm*)pTmpPage->GetNext() ) @@ -574,7 +574,7 @@ void SwFlyLayFrm::Modify( SfxPoolItem *pOld, SfxPoolItem *pNew ) { SwNodeIndex aIdx( pAnch->GetCntntAnchor()->nNode ); SwCntntFrm *pCntnt = GetFmt()->GetDoc()->GetNodes().GoNext( &aIdx )-> - GetCntntNode()->GetFrm( 0, 0, sal_False ); + GetCntntNode()->getLayoutFrm( getRootFrm(), 0, 0, sal_False ); if( pCntnt ) { SwFlyFrm *pTmp = pCntnt->FindFlyFrm(); @@ -602,7 +602,7 @@ void SwFlyLayFrm::Modify( SfxPoolItem *pOld, SfxPoolItem *pNew ) void SwPageFrm::AppendFlyToPage( SwFlyFrm *pNew ) { if ( !pNew->GetVirtDrawObj()->IsInserted() ) - FindRootFrm()->GetDrawPage()->InsertObject( + getRootFrm()->GetDrawPage()->InsertObject( (SdrObject*)pNew->GetVirtDrawObj(), pNew->GetVirtDrawObj()->GetReferencedObj().GetOrdNumDirect() ); @@ -708,7 +708,7 @@ void SwPageFrm::AppendFlyToPage( SwFlyFrm *pNew ) void SwPageFrm::RemoveFlyFromPage( SwFlyFrm *pToRemove ) { const sal_uInt32 nOrdNum = pToRemove->GetVirtDrawObj()->GetOrdNum(); - FindRootFrm()->GetDrawPage()->RemoveObject( nOrdNum ); + getRootFrm()->GetDrawPage()->RemoveObject( nOrdNum ); pToRemove->GetVirtDrawObj()->ReferencedObj().SetOrdNum( nOrdNum ); if ( GetUpper() ) @@ -970,7 +970,7 @@ void SwPageFrm::PlaceFly( SwFlyFrm* pFly, SwFlyFrmFmt* pFmt ) AppendFly( pFly ); else { OSL_ENSURE( pFmt, ":-( kein Format fuer Fly uebergeben." ); - pFly = new SwFlyLayFrm( (SwFlyFrmFmt*)pFmt, this ); + pFly = new SwFlyLayFrm( (SwFlyFrmFmt*)pFmt, this, this ); AppendFly( pFly ); ::RegistFlys( this, pFly ); } diff --git a/sw/source/core/layout/flypos.cxx b/sw/source/core/layout/flypos.cxx index 6ac6bf772502..2c9c4e1b20f4 100644 --- a/sw/source/core/layout/flypos.cxx +++ b/sw/source/core/layout/flypos.cxx @@ -29,13 +29,9 @@ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_sw.hxx" - - #include "doc.hxx" #include "node.hxx" #include <docary.hxx> - - #include <fmtanchr.hxx> #include "flypos.hxx" #include "frmfmt.hxx" @@ -44,8 +40,7 @@ #include "flyfrm.hxx" #include "dflyobj.hxx" #include "ndindex.hxx" - - +#include "switerator.hxx" SV_IMPL_OP_PTRARR_SORT( SwPosFlyFrms, SwPosFlyFrmPtr ) @@ -53,28 +48,33 @@ SwPosFlyFrm::SwPosFlyFrm( const SwNodeIndex& rIdx, const SwFrmFmt* pFmt, sal_uInt16 nArrPos ) : pFrmFmt( pFmt ), pNdIdx( (SwNodeIndex*) &rIdx ) { - sal_Bool bFnd = sal_False; + bool bFnd = false; const SwFmtAnchor& rAnchor = pFmt->GetAnchor(); if (FLY_AT_PAGE == rAnchor.GetAnchorId()) { pNdIdx = new SwNodeIndex( rIdx ); } - else if( pFmt->GetDoc()->GetRootFrm() ) + else if( pFmt->GetDoc()->GetCurrentViewShell() ) //swmod 071108//swmod 071225 { - SwClientIter aIter( (SwFmt&)*pFmt ); if( RES_FLYFRMFMT == pFmt->Which() ) { // Schauen, ob es ein SdrObject dafuer gibt - if( aIter.First( TYPE( SwFlyFrm) ) ) - nOrdNum = ((SwFlyFrm*)aIter())->GetVirtDrawObj()->GetOrdNum(), - bFnd = sal_True; + SwFlyFrm* pFly = SwIterator<SwFlyFrm,SwFmt>::FirstElement(*pFmt); + if( pFly ) + { + nOrdNum = pFly->GetVirtDrawObj()->GetOrdNum(); + bFnd = true; + } } else if( RES_DRAWFRMFMT == pFmt->Which() ) { // Schauen, ob es ein SdrObject dafuer gibt - if( aIter.First( TYPE(SwDrawContact) ) ) - nOrdNum = ((SwDrawContact*)aIter())->GetMaster()->GetOrdNum(), - bFnd = sal_True; + SwDrawContact* pContact = SwIterator<SwDrawContact,SwFmt>::FirstElement(*pFmt); + if( pContact ) + { + nOrdNum = pContact->GetMaster()->GetOrdNum(); + bFnd = true; + } } } diff --git a/sw/source/core/layout/frmtool.cxx b/sw/source/core/layout/frmtool.cxx index 05349725ab22..c7315a282b3f 100644 --- a/sw/source/core/layout/frmtool.cxx +++ b/sw/source/core/layout/frmtool.cxx @@ -39,10 +39,8 @@ #include <editeng/lrspitem.hxx> #include <editeng/boxitem.hxx> #include <sfx2/printer.hxx> -// OD 08.01.2004 #i11859# #include <editeng/lspcitem.hxx> - #include <fmtornt.hxx> #include <fmtanchr.hxx> #include <fmthdft.hxx> @@ -57,6 +55,7 @@ #include "doc.hxx" #include "fesh.hxx" #include "viewimp.hxx" +#include "viewopt.hxx" #include "pam.hxx" #include "dflyobj.hxx" #include "dcontact.hxx" @@ -79,18 +78,13 @@ #include "hints.hxx" #include <layhelp.hxx> #include <laycache.hxx> - #include <rootfrm.hxx> - #include "mdiexp.hxx" #include "statstr.hrc" -// OD 21.05.2003 #108789# #include <paratr.hxx> -// OD 2004-05-24 #i28701# #include <sortedobjs.hxx> -// --> OD 2005-03-04 #b6234250# #include <objectformatter.hxx> -// <-- +#include <switerator.hxx> // ftnfrm.cxx: void lcl_RemoveFtns( SwFtnBossFrm* pBoss, sal_Bool bPageOnly, sal_Bool bEndNotes ); @@ -107,11 +101,7 @@ sal_Bool StackHack::bLocked = sal_False; -/************************************************************************* -|* -|* SwFrmNotify::SwFrmNotify() -|* -|*************************************************************************/ +/*************************************************************************/ SwFrmNotify::SwFrmNotify( SwFrm *pF ) : pFrm( pF ), @@ -119,9 +109,7 @@ SwFrmNotify::SwFrmNotify( SwFrm *pF ) : aPrt( pF->Prt() ), bInvaKeep( sal_False ), bValidSize( pF->GetValidSizeFlag() ), - // --> OD 2005-07-29 #i49383# - mbFrmDeleted( false ) - // <-- + mbFrmDeleted( false ) // #i49383# { if ( pF->IsTxtFrm() ) { @@ -139,20 +127,15 @@ SwFrmNotify::SwFrmNotify( SwFrm *pF ) : sal_False; } -/************************************************************************* -|* -|* SwFrmNotify::~SwFrmNotify() -|* -|*************************************************************************/ +/*************************************************************************/ SwFrmNotify::~SwFrmNotify() { - // --> OD 2005-07-29 #i49383# + // #i49383# if ( mbFrmDeleted ) { return; } - // <-- SWRECTFN( pFrm ) const sal_Bool bAbsP = POS_DIFF( aFrm, pFrm->Frm() ); @@ -212,19 +195,18 @@ SwFrmNotify::~SwFrmNotify() pFrm->SetCompletePaint(); SwFrm* pNxt = pFrm->GetIndNext(); - // --> OD 2005-05-20 #121888# - skip empty section frames + // #121888# - skip empty section frames while ( pNxt && pNxt->IsSctFrm() && !static_cast<SwSectionFrm*>(pNxt)->GetSection() ) { pNxt = pNxt->GetIndNext(); } - // <-- if ( pNxt ) pNxt->InvalidatePos(); else { - // OD 04.11.2002 #104100# - correct condition for setting retouche + // #104100# - correct condition for setting retouche // flag for vertical layout. if( pFrm->IsRetoucheFrm() && (aFrm.*fnRect->fnTopDist)( (pFrm->Frm().*fnRect->fnGetTop)() ) > 0 ) @@ -255,7 +237,7 @@ SwFrmNotify::~SwFrmNotify() } else { - // OD 13.11.2002 #97597# - consider case that *only* margins between + // #97597# - consider case that *only* margins between // frame and printing area has changed. Then, frame has to be repainted, // in order to force paint of the margin areas. if ( !bAbsP && (bChgWidth || bChgHeight) ) @@ -270,7 +252,7 @@ SwFrmNotify::~SwFrmNotify() { if( pFrm->IsAccessibleFrm() ) { - SwRootFrm *pRootFrm = pFrm->FindRootFrm(); + SwRootFrm *pRootFrm = pFrm->getRootFrm(); if( pRootFrm && pRootFrm->IsAnyShellAccessible() && pRootFrm->GetCurrShell() ) { @@ -404,7 +386,7 @@ SwFrmNotify::~SwFrmNotify() } else if( pFrm->IsTxtFrm() && bValidSize != pFrm->GetValidSizeFlag() ) { - SwRootFrm *pRootFrm = pFrm->FindRootFrm(); + SwRootFrm *pRootFrm = pFrm->getRootFrm(); if( pRootFrm && pRootFrm->IsAnyShellAccessible() && pRootFrm->GetCurrShell() ) { @@ -450,12 +432,7 @@ SwFrmNotify::~SwFrmNotify() } } -/************************************************************************* -|* -|* SwLayNotify::SwLayNotify() -|* -|*************************************************************************/ - +/*************************************************************************/ SwLayNotify::SwLayNotify( SwLayoutFrm *pLayFrm ) : SwFrmNotify( pLayFrm ), @@ -463,11 +440,7 @@ SwLayNotify::SwLayNotify( SwLayoutFrm *pLayFrm ) : { } -/************************************************************************* -|* -|* SwLayNotify::~SwLayNotify() -|* -|*************************************************************************/ +/*************************************************************************/ // OD 2004-05-11 #i28701# - local method to invalidate the position of all // frames inclusive its floating screen objects, which are lowers of the given @@ -595,13 +568,16 @@ SwLayNotify::~SwLayNotify() if ( pLay->IsTabFrm() ) //Damit _nur_ der Shatten bei Groessenaenderungen gemalt wird. ((SwTabFrm*)pLay)->SetComplete(); - else if ( !pLay->GetFmt()->getIDocumentSettingAccess()->get(IDocumentSettingAccess::BROWSE_MODE) || + else + { + const ViewShell *pSh = pLay->getRootFrm()->GetCurrShell(); + if( !( pSh && pSh->GetViewOptions()->getBrowseMode() ) || !(pLay->GetType() & (FRM_BODY | FRM_PAGE)) ) //Damit die untergeordneten sauber retouchiert werden. //Problembsp: Flys an den Henkeln packen und verkleinern. //Nicht fuer Body und Page, sonst flackerts beim HTML-Laden. pLay->SetCompletePaint(); - + } } //Lower benachrichtigen wenn sich die Position veraendert hat. const sal_Bool bPrtPos = POS_DIFF( aPrt, pLay->Prt() ); @@ -676,11 +652,7 @@ SwLayNotify::~SwLayNotify() ((SwFlyFrm*)pLay)->AnchorFrm()->InvalidateSize(); } -/************************************************************************* -|* -|* SwFlyNotify::SwFlyNotify() -|* -|*************************************************************************/ +/*************************************************************************/ SwFlyNotify::SwFlyNotify( SwFlyFrm *pFlyFrm ) : SwLayNotify( pFlyFrm ), @@ -692,11 +664,7 @@ SwFlyNotify::SwFlyNotify( SwFlyFrm *pFlyFrm ) : { } -/************************************************************************* -|* -|* SwFlyNotify::~SwFlyNotify() -|* -|*************************************************************************/ +/*************************************************************************/ SwFlyNotify::~SwFlyNotify() { @@ -710,7 +678,7 @@ SwFlyNotify::~SwFlyNotify() SwFlyFrm *pFly = GetFly(); if ( pFly->IsNotifyBack() ) { - ViewShell *pSh = pFly->GetShell(); + ViewShell *pSh = pFly->getRootFrm()->GetCurrShell(); SwViewImp *pImp = pSh ? pSh->Imp() : 0; if ( !pImp || !pImp->IsAction() || !pImp->GetLayAction().IsAgain() ) { @@ -805,11 +773,7 @@ SwFlyNotify::~SwFlyNotify() } } -/************************************************************************* -|* -|* SwCntntNotify::SwCntntNotify() -|* -|*************************************************************************/ +/*************************************************************************/ SwCntntNotify::SwCntntNotify( SwCntntFrm *pCntntFrm ) : SwFrmNotify( pCntntFrm ), @@ -837,11 +801,7 @@ SwCntntNotify::SwCntntNotify( SwCntntFrm *pCntntFrm ) : } } -/************************************************************************* -|* -|* SwCntntNotify::~SwCntntNotify() -|* -|*************************************************************************/ +/*************************************************************************/ SwCntntNotify::~SwCntntNotify() { @@ -921,7 +881,7 @@ SwCntntNotify::~SwCntntNotify() { //Aktive PlugIn's oder OLE-Objekte sollten etwas von der Veraenderung //mitbekommen, damit sie Ihr Window entsprechend verschieben. - ViewShell *pSh = pCnt->GetShell(); + ViewShell *pSh = pCnt->getRootFrm()->GetCurrShell(); if ( pSh ) { SwOLENode *pNd; @@ -1080,15 +1040,7 @@ SwCntntNotify::~SwCntntNotify() // <-- } -/************************************************************************* -|* -|* InsertCnt -|* -|* Beschreibung Hilfsfunktionen, die friend von irgendwem sind, damit -|* nicht immer gleich 'ne ganze Klasse befreundet werden -|* muss. -|* -|*************************************************************************/ +/*************************************************************************/ void AppendObjs( const SwSpzFrmFmts *pTbl, sal_uLong nIndex, SwFrm *pFrm, SwPageFrm *pPage ) @@ -1154,9 +1106,9 @@ void AppendObjs( const SwSpzFrmFmts *pTbl, sal_uLong nIndex, { SwFlyFrm *pFly; if( bFlyAtFly ) - pFly = new SwFlyLayFrm( (SwFlyFrmFmt*)pFmt, pFrm ); + pFly = new SwFlyLayFrm( (SwFlyFrmFmt*)pFmt, pFrm, pFrm ); else - pFly = new SwFlyAtCntFrm( (SwFlyFrmFmt*)pFmt, pFrm ); + pFly = new SwFlyAtCntFrm( (SwFlyFrmFmt*)pFmt, pFrm, pFrm ); pFly->Lock(); pFrm->AppendFly( pFly ); pFly->Unlock(); @@ -1168,18 +1120,26 @@ void AppendObjs( const SwSpzFrmFmts *pTbl, sal_uLong nIndex, } } -sal_Bool MA_FASTCALL lcl_ObjConnected( SwFrmFmt *pFmt ) +bool lcl_ObjConnected( SwFrmFmt *pFmt, const SwFrm* pSib ) { - SwClientIter aIter( *pFmt ); + SwIterator<SwFlyFrm,SwFmt> aIter( *pFmt ); if ( RES_FLYFRMFMT == pFmt->Which() ) - return 0 != aIter.First( TYPE(SwFlyFrm) ); + { + const SwRootFrm* pRoot = pSib ? pSib->getRootFrm() : 0; + const SwFlyFrm* pTmpFrm; + for( pTmpFrm = aIter.First(); pTmpFrm; pTmpFrm = aIter.Next() ) + { + if(! pRoot || pRoot == pTmpFrm->getRootFrm() ) + return true; + } + } else { - SwDrawContact *pContact; - if ( 0 != (pContact = (SwDrawContact*)aIter.First( TYPE(SwDrawContact)))) + SwDrawContact *pContact = SwIterator<SwDrawContact,SwFmt>::FirstElement(*pFmt); + if ( pContact ) return pContact->GetAnchorFrm() != 0; } - return sal_False; + return false; } /** helper method to determine, if a <SwFrmFmt>, which has an object connected, @@ -1191,9 +1151,6 @@ sal_Bool MA_FASTCALL lcl_ObjConnected( SwFrmFmt *pFmt ) */ bool lcl_InHeaderOrFooter( SwFrmFmt& _rFmt ) { - OSL_ENSURE( lcl_ObjConnected( &_rFmt ), - "::lcl_InHeaderOrFooter(..) - <SwFrmFmt> has no connected object" ); - bool bRetVal = false; const SwFmtAnchor& rAnch = _rFmt.GetAnchor(); @@ -1206,7 +1163,7 @@ bool lcl_InHeaderOrFooter( SwFrmFmt& _rFmt ) return bRetVal; } -void AppendAllObjs( const SwSpzFrmFmts *pTbl ) +void AppendAllObjs( const SwSpzFrmFmts *pTbl, const SwFrm* pSib ) { //Verbinden aller Objekte, die in der SpzTbl beschrieben sind mit dem //Layout. @@ -1234,7 +1191,7 @@ void AppendAllObjs( const SwSpzFrmFmts *pTbl ) //will ich hier nicht. bRemove = sal_True; } - else if ( sal_False == (bRemove = ::lcl_ObjConnected( pFmt )) || + else if ( sal_False == (bRemove = ::lcl_ObjConnected( pFmt, pSib )) || ::lcl_InHeaderOrFooter( *pFmt ) ) { // OD 23.06.2003 #108784# - correction: for objects in header @@ -1244,7 +1201,7 @@ void AppendAllObjs( const SwSpzFrmFmts *pTbl ) //keine abhaengigen Existieren, andernfalls, oder wenn das //MakeFrms keine abhaengigen erzeugt, entfernen. pFmt->MakeFrms(); - bRemove = ::lcl_ObjConnected( pFmt ); + bRemove = ::lcl_ObjConnected( pFmt, pSib ); } if ( bRemove ) { @@ -1280,9 +1237,9 @@ void MA_FASTCALL _InsertCnt( SwLayoutFrm *pLay, SwDoc *pDoc, SwFrm *pPrv ) { pDoc->BlockIdling(); - SwRootFrm* pLayout = pDoc->GetRootFrm(); + SwRootFrm* pLayout = pLay->getRootFrm(); const sal_Bool bOldCallbackActionEnabled = pLayout ? pLayout->IsCallbackActionEnabled() : sal_False; - if(pLayout) + if( bOldCallbackActionEnabled ) pLayout->SetCallbackActionEnabled( sal_False ); //Bei der Erzeugung des Layouts wird bPages mit sal_True uebergeben. Dann @@ -1362,8 +1319,8 @@ void MA_FASTCALL _InsertCnt( SwLayoutFrm *pLay, SwDoc *pDoc, if ( pNd->IsCntntNode() ) { SwCntntNode* pNode = (SwCntntNode*)pNd; - pFrm = pNode->IsTxtNode() ? new SwTxtFrm( (SwTxtNode*)pNode ) : - pNode->MakeFrm(); + pFrm = pNode->IsTxtNode() ? new SwTxtFrm( (SwTxtNode*)pNode, pLay ) : + pNode->MakeFrm( pLay ); if( pPageMaker ) pPageMaker->CheckInsert( nIndex ); @@ -1375,7 +1332,7 @@ void MA_FASTCALL _InsertCnt( SwLayoutFrm *pLay, SwDoc *pDoc, // and relation CONTENT_FLOWS_TO for previous paragraph will change. if ( pFrm->IsTxtFrm() ) { - ViewShell* pViewShell( pFrm->GetShell() ); + ViewShell* pViewShell( pFrm->getRootFrm()->GetCurrShell() ); // no notification, if <ViewShell> is in construction if ( pViewShell && !pViewShell->IsInConstructor() && pViewShell->GetLayout() && @@ -1415,7 +1372,7 @@ void MA_FASTCALL _InsertCnt( SwLayoutFrm *pLay, SwDoc *pDoc, pDoc->UpdateTblFlds( &aMsgHnt ); pTblNode->GetTable().GCLines(); - pFrm = pTblNode->MakeFrm(); + pFrm = pTblNode->MakeFrm( pLay ); if( pPageMaker ) pPageMaker->CheckInsert( nIndex ); @@ -1427,7 +1384,7 @@ void MA_FASTCALL _InsertCnt( SwLayoutFrm *pLay, SwDoc *pDoc, // Relation CONTENT_FLOWS_FROM for next paragraph will change // and relation CONTENT_FLOWS_TO for previous paragraph will change. { - ViewShell* pViewShell( pFrm->GetShell() ); + ViewShell* pViewShell( pFrm->getRootFrm()->GetCurrShell() ); // no notification, if <ViewShell> is in construction if ( pViewShell && !pViewShell->IsInConstructor() && pViewShell->GetLayout() && @@ -1465,7 +1422,7 @@ void MA_FASTCALL _InsertCnt( SwLayoutFrm *pLay, SwDoc *pDoc, nIndex = pNode->EndOfSectionIndex(); else { - pFrm = pNode->MakeFrm(); + pFrm = pNode->MakeFrm( pLay ); pActualSection = new SwActualSection( pActualSection, (SwSectionFrm*)pFrm, pNode ); if ( pActualSection->GetUpper() ) @@ -1504,7 +1461,7 @@ void MA_FASTCALL _InsertCnt( SwLayoutFrm *pLay, SwDoc *pDoc, // Relation CONTENT_FLOWS_FROM for next paragraph will change // and relation CONTENT_FLOWS_TO for previous paragraph will change. { - ViewShell* pViewShell( pFrm->GetShell() ); + ViewShell* pViewShell( pFrm->getRootFrm()->GetCurrShell() ); // no notification, if <ViewShell> is in construction if ( pViewShell && !pViewShell->IsInConstructor() && pViewShell->GetLayout() && @@ -1576,7 +1533,7 @@ void MA_FASTCALL _InsertCnt( SwLayoutFrm *pLay, SwDoc *pDoc, } // new section frame - pFrm = pActualSection->GetSectionNode()->MakeFrm(); + pFrm = pActualSection->GetSectionNode()->MakeFrm( pLay ); pFrm->InsertBehind( pLay, pPrv ); static_cast<SwSectionFrm*>(pFrm)->Init(); @@ -1654,7 +1611,7 @@ void MA_FASTCALL _InsertCnt( SwLayoutFrm *pLay, SwDoc *pDoc, if ( bPages ) //Jetzt noch die Flys verbinden lassen. { if ( !bDontCreateObjects ) - AppendAllObjs( pTbl ); + AppendAllObjs( pTbl, pLayout ); bObjsDirect = sal_True; } @@ -1672,7 +1629,7 @@ void MA_FASTCALL _InsertCnt( SwLayoutFrm *pLay, SwDoc *pDoc, } pDoc->UnblockIdling(); - if(pLayout) + if( bOldCallbackActionEnabled ) pLayout->SetCallbackActionEnabled( bOldCallbackActionEnabled ); } @@ -1855,7 +1812,7 @@ void MakeFrms( SwDoc *pDoc, const SwNodeIndex &rSttIdx, { const SwSpzFrmFmts *pTbl = pDoc->GetSpzFrmFmts(); if( pTbl->Count() ) - AppendAllObjs( pTbl ); + AppendAllObjs( pTbl, pUpper ); } // Wenn nichts eingefuegt wurde, z.B. ein ausgeblendeter Bereich, @@ -1882,7 +1839,7 @@ void MakeFrms( SwDoc *pDoc, const SwNodeIndex &rSttIdx, if( !pSct->ContainsCntnt() ) { pSct->DelEmpty( sal_True ); - pDoc->GetRootFrm()->RemoveFromList( pSct ); + pUpper->getRootFrm()->RemoveFromList( pSct ); delete pSct; } } @@ -1893,11 +1850,7 @@ void MakeFrms( SwDoc *pDoc, const SwNodeIndex &rSttIdx, } -/************************************************************************* -|* -|* SwBorderAttrs::Ctor, DTor -|* -|*************************************************************************/ +/*************************************************************************/ SwBorderAttrs::SwBorderAttrs( const SwModify *pMod, const SwFrm *pConstructor ) : SwCacheObj( pMod ), @@ -2071,11 +2024,7 @@ void SwBorderAttrs::_CalcRightLine() bRightLine = sal_False; } -/************************************************************************* -|* -|* SwBorderAttrs::_IsLine() -|* -|*************************************************************************/ +/*************************************************************************/ void SwBorderAttrs::_IsLine() { @@ -2267,11 +2216,7 @@ void SwBorderAttrs::_GetBottomLine( const SwFrm& _rFrm ) nGetBottomLine = nRet; } -/************************************************************************* -|* -|* SwBorderAttrAccess::CTor -|* -|*************************************************************************/ +/*************************************************************************/ SwBorderAttrAccess::SwBorderAttrAccess( SwCache &rCach, const SwFrm *pFrm ) : SwCacheAccess( rCach, (pFrm->IsCntntFrm() ? @@ -2284,11 +2229,7 @@ SwBorderAttrAccess::SwBorderAttrAccess( SwCache &rCach, const SwFrm *pFrm ) : { } -/************************************************************************* -|* -|* SwBorderAttrAccess::NewObj, Get -|* -|*************************************************************************/ +/*************************************************************************/ SwCacheObj *SwBorderAttrAccess::NewObj() { @@ -2301,11 +2242,7 @@ SwBorderAttrs *SwBorderAttrAccess::Get() return (SwBorderAttrs*)SwCacheAccess::Get(); } -/************************************************************************* -|* -|* SwOrderIter::Ctor -|* -|*************************************************************************/ +/*************************************************************************/ SwOrderIter::SwOrderIter( const SwPageFrm *pPg, sal_Bool bFlys ) : pPage( pPg ), @@ -2314,11 +2251,7 @@ SwOrderIter::SwOrderIter( const SwPageFrm *pPg, sal_Bool bFlys ) : { } -/************************************************************************* -|* -|* SwOrderIter::Top() -|* -|*************************************************************************/ +/*************************************************************************/ const SdrObject *SwOrderIter::Top() { @@ -2347,11 +2280,7 @@ const SdrObject *SwOrderIter::Top() return pCurrent; } -/************************************************************************* -|* -|* SwOrderIter::Bottom() -|* -|*************************************************************************/ +/*************************************************************************/ const SdrObject *SwOrderIter::Bottom() { @@ -2380,11 +2309,7 @@ const SdrObject *SwOrderIter::Bottom() return pCurrent; } -/************************************************************************* -|* -|* SwOrderIter::Next() -|* -|*************************************************************************/ +/*************************************************************************/ const SdrObject *SwOrderIter::Next() { @@ -2414,11 +2339,7 @@ const SdrObject *SwOrderIter::Next() return pCurrent; } -/************************************************************************* -|* -|* SwOrderIter::Prev() -|* -|*************************************************************************/ +/*************************************************************************/ const SdrObject *SwOrderIter::Prev() { @@ -2448,11 +2369,7 @@ const SdrObject *SwOrderIter::Prev() return pCurrent; } -/************************************************************************* -|* -|* SaveCntnt(), RestoreCntnt() -|* -|*************************************************************************/ +/*************************************************************************/ //Unterstruktur eines LayoutFrms fuer eine Aktion aufheben und wieder //restaurieren. @@ -2806,11 +2723,7 @@ sal_uLong MA_FASTCALL SqRt( BigInt nX ) return nErg >= BigInt(SAL_MAX_UINT32) ? ULONG_MAX : (sal_uLong)nErg; } -/************************************************************************* -|* -|* InsertNewPage() Einsetzen einer neuen Seite. -|* -|*************************************************************************/ +/*************************************************************************/ SwPageFrm * MA_FASTCALL InsertNewPage( SwPageDesc &rDesc, SwFrm *pUpper, sal_Bool bOdd, sal_Bool bInsertEmpty, sal_Bool bFtn, @@ -2831,11 +2744,11 @@ SwPageFrm * MA_FASTCALL InsertNewPage( SwPageDesc &rDesc, SwFrm *pUpper, { SwPageDesc *pTmpDesc = pSibling && pSibling->GetPrev() ? ((SwPageFrm*)pSibling->GetPrev())->GetPageDesc() : &rDesc; - pRet = new SwPageFrm( pDoc->GetEmptyPageFmt(), pTmpDesc ); + pRet = new SwPageFrm( pDoc->GetEmptyPageFmt(), pUpper, pTmpDesc ); pRet->Paste( pUpper, pSibling ); pRet->PreparePage( bFtn ); } - pRet = new SwPageFrm( pFmt, &rDesc ); + pRet = new SwPageFrm( pFmt, pUpper, &rDesc ); pRet->Paste( pUpper, pSibling ); pRet->PreparePage( bFtn ); if ( pRet->GetNext() ) @@ -2942,7 +2855,7 @@ void Notify( SwFlyFrm *pFly, SwPageFrm *pOld, const SwRect &rOld, //Der Einfachheit halber wird hier bewusst jeweils ein Twip //unnoetig invalidiert. - ViewShell *pSh = pFly->GetShell(); + ViewShell *pSh = pFly->getRootFrm()->GetCurrShell(); if( pSh && rOld.HasArea() ) pSh->InvalidateWindows( rOld ); @@ -3000,11 +2913,7 @@ void Notify( SwFlyFrm *pFly, SwPageFrm *pOld, const SwRect &rOld, } } -/************************************************************************* -|* -|* NotifyBackground() -|* -|*************************************************************************/ +/*************************************************************************/ void lcl_CheckFlowBack( SwFrm* pFrm, const SwRect &rRect ) { @@ -3240,7 +3149,7 @@ void Notify_Background( const SdrObject* pObj, // --> OD 2008-01-30 #i82258# - make code robust ViewShell* pSh = 0; if ( bInva && pPage && - 0 != (pSh = pPage->GetShell()) ) + 0 != (pSh = pPage->getRootFrm()->GetCurrShell()) ) { pSh->InvalidateWindows( rRect ); } @@ -3287,11 +3196,7 @@ const SwFrm* GetVirtualUpper( const SwFrm* pFrm, const Point& rPos ) return pFrm; } -/************************************************************************* -|* -|* IsLowerOf() -|* -|*************************************************************************/ +/*************************************************************************/ sal_Bool Is_Lower_Of( const SwFrm *pCurrFrm, const SdrObject* pObj ) { @@ -3305,7 +3210,7 @@ sal_Bool Is_Lower_Of( const SwFrm *pCurrFrm, const SdrObject* pObj ) } else { - pFrm = ( (SwDrawContact*)GetUserCall(pObj) )->GetAnchorFrm(); + pFrm = ( (SwDrawContact*)GetUserCall(pObj) )->GetAnchorFrm(pObj); aPos = pObj->GetCurrentBoundRect().TopLeft(); } OSL_ENSURE( pFrm, "8-( Fly is lost in Space." ); @@ -3439,35 +3344,73 @@ const SwFrm* MA_FASTCALL FindPage( const SwRect &rRect, const SwFrm *pPage ) return pPage; } -SwFrm* GetFrmOfModify( SwModify const& rMod, sal_uInt16 const nFrmType, +#include <svl/smplhint.hxx> +class SwFrmHolder : private SfxListener +{ + SwFrm* pFrm; + bool bSet; + virtual void Notify( SfxBroadcaster& rBC, const SfxHint& rHint ); +public: + SwFrmHolder() : pFrm(0), bSet(false) {} + void SetFrm( SwFrm* pHold ); + SwFrm* GetFrm() { return pFrm; } + void Reset(); + bool IsSet() { return bSet; } +}; + +void SwFrmHolder::SetFrm( SwFrm* pHold ) +{ + bSet = true; + pFrm = pHold; + StartListening(*pHold); +} + +void SwFrmHolder::Reset() +{ + if (pFrm) + EndListening(*pFrm); + bSet = false; + pFrm = 0; +} + +void SwFrmHolder::Notify( SfxBroadcaster& rBC, const SfxHint& rHint ) +{ + if ( rHint.IsA(TYPE(SfxSimpleHint)) ) + { + if ( ( (SfxSimpleHint&) rHint ).GetId() == SFX_HINT_DYING && &rBC == pFrm ) + pFrm = 0; + } +} + +SwFrm* GetFrmOfModify( const SwRootFrm* pLayout, SwModify const& rMod, sal_uInt16 const nFrmType, const Point* pPoint, const SwPosition *pPos, const sal_Bool bCalcFrm ) { SwFrm *pMinFrm = 0, *pTmpFrm; + SwFrmHolder aHolder; SwRect aCalcRect; bool bClientIterChanged = false; - SwClientIter aIter( rMod ); + SwIterator<SwFrm,SwModify> aIter( rMod ); do { pMinFrm = 0; + aHolder.Reset(); sal_uInt64 nMinDist = 0; bClientIterChanged = false; - for( pTmpFrm = (SwFrm*)aIter.First( TYPE( SwFrm )); pTmpFrm; - pTmpFrm = (SwFrm*)aIter.Next() ) + for( pTmpFrm = aIter.First(); pTmpFrm; pTmpFrm = aIter.Next() ) { if( pTmpFrm->GetType() & nFrmType && + ( !pLayout || pLayout == pTmpFrm->getRootFrm() ) && (!pTmpFrm->IsFlowFrm() || !SwFlowFrm::CastFlowFrm( pTmpFrm )->IsFollow() )) { if( pPoint ) { - // --> FME 2006-02-03 #127369# - // Set pointer to be watched. If a client is removed from - // rMod (e.g., by deleting a frame), the bWatchDeleted flag - // is set at the SwClientIter. - const bool bWatchClientSet = pMinFrm != 0; - aIter.SetWatchClient( pMinFrm ); - // <-- + // watch for Frm being deleted + if ( pMinFrm ) + aHolder.SetFrm( pMinFrm ); + else + aHolder.Reset(); if( bCalcFrm ) { @@ -3485,14 +3428,13 @@ SwFrm* GetFrmOfModify( SwModify const& rMod, sal_uInt16 const nFrmType, pTmpFrm->Calc(); } - // --> FME 2006-02-03 #127369# - // The SwClientIter list has changed. Restart. - // aIter.IsChanged basically checks if pTmpFrm has been - // deleted. bWatchClientSet && aIter.GetWatchClient() - // checks if pMinFrm has been deleted. - // <-- - if( aIter.IsChanged() || ( bWatchClientSet && !aIter.GetWatchClient() ) ) + // #127369# + // aIter.IsChanged checks if the current pTmpFrm has been deleted while + // it is the current iterator + // FrmHolder watches for deletion of the current pMinFrm + if( aIter.IsChanged() || ( aHolder.IsSet() && !aHolder.GetFrm() ) ) { + // restart iteration bClientIterChanged = true; break; } @@ -3646,15 +3588,13 @@ bool SwDeletionChecker::HasBeenDeleted() if ( !mpFrm || !mpRegIn ) return false; - SwClientIter aIter( const_cast<SwModify&>(*mpRegIn) ); - const SwClient* pLast = aIter.GoStart(); - + SwIterator<SwFrm,SwModify> aIter(*mpRegIn); + SwFrm* pLast = aIter.First(); while ( pLast ) { - if ( pLast->ISA( SwFrm ) && pLast == mpFrm ) + if ( pLast == mpFrm ) return false; - - pLast = aIter++; + pLast = aIter.Next(); } return true; diff --git a/sw/source/core/layout/ftnfrm.cxx b/sw/source/core/layout/ftnfrm.cxx index 05ea77043e15..608ecb57ddd5 100644 --- a/sw/source/core/layout/ftnfrm.cxx +++ b/sw/source/core/layout/ftnfrm.cxx @@ -48,9 +48,10 @@ #include <ndindex.hxx> #include <sectfrm.hxx> #include <pam.hxx> -// --> OD 2005-05-17 #i49383# #include <objectformatter.hxx> -// <-- +#include "viewopt.hxx" +#include "viewsh.hxx" +#include <switerator.hxx> /************************************************************************* |* @@ -179,8 +180,8 @@ sal_uInt16 lcl_ColumnNum( const SwFrm* pBoss ) |*************************************************************************/ -SwFtnContFrm::SwFtnContFrm( SwFrmFmt *pFmt ): - SwLayoutFrm( pFmt ) +SwFtnContFrm::SwFtnContFrm( SwFrmFmt *pFmt, SwFrm* pSib ): + SwLayoutFrm( pFmt, pSib ) { nType = FRMC_FTNCONT; } @@ -246,7 +247,14 @@ void SwFtnContFrm::Format( const SwBorderAttrs * ) if ( !bValidSize ) { - if ( pPage->IsFtnPage() && !GetFmt()->getIDocumentSettingAccess()->get(IDocumentSettingAccess::BROWSE_MODE) ) + bool bGrow = pPage->IsFtnPage(); + if( bGrow ) + { + const ViewShell *pSh = getRootFrm() ? getRootFrm()->GetCurrShell() : 0; + if( pSh && pSh->GetViewOptions()->getBrowseMode() ) + bGrow = false; + } + if( bGrow ) Grow( LONG_MAX, sal_False ); else { @@ -339,7 +347,8 @@ SwTwips SwFtnContFrm::GrowFrm( SwTwips nDist, sal_Bool bTst, sal_Bool ) return 0; } } - const bool bBrowseMode = GetFmt()->getIDocumentSettingAccess()->get(IDocumentSettingAccess::BROWSE_MODE); + const ViewShell *pSh = getRootFrm() ? getRootFrm()->GetCurrShell() : 0; + const sal_Bool bBrowseMode = pSh && pSh->GetViewOptions()->getBrowseMode(); SwPageFrm *pPage = pBoss->FindPageFrm(); if ( bBrowseMode || !pPage->IsFtnPage() ) { @@ -445,9 +454,19 @@ SwTwips SwFtnContFrm::GrowFrm( SwTwips nDist, sal_Bool bTst, sal_Bool ) SwTwips SwFtnContFrm::ShrinkFrm( SwTwips nDiff, sal_Bool bTst, sal_Bool bInfo ) { SwPageFrm *pPage = FindPageFrm(); - if ( pPage && - ( !pPage->IsFtnPage() || - GetFmt()->getIDocumentSettingAccess()->get(IDocumentSettingAccess::BROWSE_MODE) ) ) + bool bShrink = false; + if ( pPage ) + { + if( !pPage->IsFtnPage() ) + bShrink = true; + else + { + const ViewShell *pSh = getRootFrm()->GetCurrShell(); + if( pSh && pSh->GetViewOptions()->getBrowseMode() ) + bShrink = true; + } + } + if( bShrink ) { SwTwips nRet = SwLayoutFrm::ShrinkFrm( nDiff, bTst, bInfo ); if( IsInSct() && !bTst ) @@ -470,8 +489,8 @@ SwTwips SwFtnContFrm::ShrinkFrm( SwTwips nDiff, sal_Bool bTst, sal_Bool bInfo ) |*************************************************************************/ -SwFtnFrm::SwFtnFrm( SwFrmFmt *pFmt, SwCntntFrm *pCnt, SwTxtFtn *pAt ): - SwLayoutFrm( pFmt ), +SwFtnFrm::SwFtnFrm( SwFrmFmt *pFmt, SwFrm* pSib, SwCntntFrm *pCnt, SwTxtFtn *pAt ): + SwLayoutFrm( pFmt, pSib ), pFollow( 0 ), pMaster( 0 ), pRef( pCnt ), @@ -585,8 +604,8 @@ void SwFtnFrm::Cut() if ( pPage ) { SwLayoutFrm *pBody = pPage->FindBodyCont(); - if ( !pBody->ContainsCntnt() ) - pPage->FindRootFrm()->SetSuperfluous(); + if( pBody && !pBody->ContainsCntnt() ) + pPage->getRootFrm()->SetSuperfluous(); } SwSectionFrm* pSect = pUp->FindSctFrm(); pUp->Cut(); @@ -1073,7 +1092,7 @@ SwFtnContFrm *SwFtnBossFrm::MakeFtnCont() } #endif - SwFtnContFrm *pNew = new SwFtnContFrm( GetFmt()->GetDoc()->GetDfltFrmFmt()); + SwFtnContFrm *pNew = new SwFtnContFrm( GetFmt()->GetDoc()->GetDfltFrmFmt(), this ); SwLayoutFrm *pLay = FindBodyCont(); pNew->Paste( this, pLay->GetNext() ); return pNew; @@ -1286,13 +1305,12 @@ void SwFtnBossFrm::ResetFtn( const SwFtnFrm *pCheck ) if ( !pNd ) pNd = pCheck->GetFmt()->GetDoc()-> GetNodes().GoNextSection( &aIdx, sal_True, sal_False ); - SwClientIter aIter( *pNd ); - SwClient* pLast = aIter.GoStart(); - while( pLast ) + SwIterator<SwFrm,SwCntntNode> aIter( *pNd ); + SwFrm* pFrm = aIter.First(); + while( pFrm ) { - if ( pLast->ISA(SwFrm) ) - { - SwFrm *pFrm = (SwFrm*)pLast; + if( pFrm->getRootFrm() == pCheck->getRootFrm() ) + { SwFrm *pTmp = pFrm->GetUpper(); while ( pTmp && !pTmp->IsFtnFrm() ) pTmp = pTmp->GetUpper(); @@ -1311,7 +1329,8 @@ void SwFtnBossFrm::ResetFtn( const SwFtnFrm *pCheck ) } } } - pLast = ++aIter; + + pFrm = aIter.Next(); } } @@ -1730,7 +1749,7 @@ void SwFtnBossFrm::AppendFtn( SwCntntFrm *pRef, SwTxtFtn *pAttr ) } } - SwFtnFrm *pNew = new SwFtnFrm( pDoc->GetDfltFrmFmt(), pRef, pAttr ); + SwFtnFrm *pNew = new SwFtnFrm( pDoc->GetDfltFrmFmt(), this, pRef, pAttr ); { SwNodeIndex aIdx( *pAttr->GetStartNode(), 1 ); ::_InsertCnt( pNew, pDoc, aIdx.GetIndex() ); @@ -1832,14 +1851,12 @@ SwFtnFrm *SwFtnBossFrm::FindFtn( const SwCntntFrm *pRef, const SwTxtFtn *pAttr ) GetNodes().GoNextSection( &aIdx, sal_True, sal_False ); if ( !pNd ) return 0; - SwClientIter aIter( *pNd ); - SwClient *pClient; - if ( 0 != (pClient = aIter.GoStart()) ) + SwIterator<SwFrm,SwCntntNode> aIter( *pNd ); + SwFrm* pFrm = aIter.First(); + if( pFrm ) do { - if ( pClient->IsA( TYPE(SwFrm) ) ) - { - SwFrm *pFrm = ((SwFrm*)pClient)->GetUpper(); + pFrm = pFrm->GetUpper(); // #i28500#, #i27243# Due to the endnode collector, there are // SwFtnFrms, which are not in the layout. Therefore the // bInfFtn flags are not set correctly, and a cell of FindFtnFrm @@ -1857,8 +1874,8 @@ SwFtnFrm *SwFtnBossFrm::FindFtn( const SwCntntFrm *pRef, const SwTxtFtn *pAttr ) pFtn = pFtn->GetMaster(); return pFtn; } - } - } while ( 0 != (pClient = aIter++) ); + + } while ( 0 != (pFrm = aIter.Next()) ); return 0; } @@ -2720,7 +2737,8 @@ void SwFtnBossFrm::SetFtnDeadLine( const SwTwips nDeadLine ) else nMaxFtnHeight = -(pBody->Frm().*fnRect->fnBottomDist)( nDeadLine ); - if ( GetFmt()->getIDocumentSettingAccess()->get(IDocumentSettingAccess::BROWSE_MODE) ) + const ViewShell *pSh = getRootFrm() ? getRootFrm()->GetCurrShell() : 0; + if( pSh && pSh->GetViewOptions()->getBrowseMode() ) nMaxFtnHeight += pBody->Grow( LONG_MAX, sal_True ); if ( IsInSct() ) nMaxFtnHeight += FindSctFrm()->Grow( LONG_MAX, sal_True ); @@ -2799,9 +2817,12 @@ SwTwips SwFtnBossFrm::GetVarSpace() const } else nRet = 0; - if ( IsPageFrm() && - GetFmt()->getIDocumentSettingAccess()->get(IDocumentSettingAccess::BROWSE_MODE) ) + if ( IsPageFrm() ) + { + const ViewShell *pSh = getRootFrm() ? getRootFrm()->GetCurrShell() : 0; + if( pSh && pSh->GetViewOptions()->getBrowseMode() ) nRet += BROWSE_HEIGHT - Frm().Height(); + } return nRet; } @@ -3036,7 +3057,7 @@ sal_Bool SwCntntFrm::MoveFtnCntFwd( sal_Bool bMakePage, SwFtnBossFrm *pOldBoss ) //Fussnote erzeugen. SwFtnFrm *pOld = FindFtnFrm(); pTmpFtn = new SwFtnFrm( pOld->GetFmt()->GetDoc()->GetDfltFrmFmt(), - pOld->GetRef(), pOld->GetAttr() ); + pOld, pOld->GetRef(), pOld->GetAttr() ); //Verkettung der Fussnoten. if ( pOld->GetFollow() ) { @@ -3167,7 +3188,7 @@ SwCntntFrm* SwFtnFrm::GetRefFromAttr() OSL_ENSURE( pAttr, "invalid Attribute" ); SwTxtNode& rTNd = (SwTxtNode&)pAttr->GetTxtNode(); SwPosition aPos( rTNd, SwIndex( &rTNd, *pAttr->GetStart() )); - SwCntntFrm* pCFrm = rTNd.GetFrm( 0, &aPos, sal_False ); + SwCntntFrm* pCFrm = rTNd.getLayoutFrm( getRootFrm(), 0, &aPos, sal_False ); return pCFrm; } diff --git a/sw/source/core/layout/hffrm.cxx b/sw/source/core/layout/hffrm.cxx index 298761e901e1..b8168dca941a 100644 --- a/sw/source/core/layout/hffrm.cxx +++ b/sw/source/core/layout/hffrm.cxx @@ -35,7 +35,9 @@ #include <fmtcntnt.hxx> #include <fmthdft.hxx> #include <fmtfsize.hxx> +#include "viewopt.hxx" #include "hffrm.hxx" +#include "rootfrm.hxx" #include "txtfrm.hxx" #include "sectfrm.hxx" #include "flyfrm.hxx" @@ -117,8 +119,8 @@ static void lcl_LayoutFrmEnsureMinHeight(SwLayoutFrm & rFrm, } } -SwHeadFootFrm::SwHeadFootFrm( SwFrmFmt * pFmt, sal_uInt16 nTypeIn) - : SwLayoutFrm(pFmt) +SwHeadFootFrm::SwHeadFootFrm( SwFrmFmt * pFmt, SwFrm* pSib, sal_uInt16 nTypeIn) + : SwLayoutFrm( pFmt, pSib ) { nType = nTypeIn; SetDerivedVert( sal_False ); @@ -706,9 +708,10 @@ void SwPageFrm::PrepareHeader() if ( !pLay ) return; - const SwFmtHeader &rH = ((SwFrmFmt*)pRegisteredIn)->GetHeader(); + const SwFmtHeader &rH = ((SwFrmFmt*)GetRegisteredIn())->GetHeader(); - const sal_Bool bOn = !((SwFrmFmt*)pRegisteredIn)->getIDocumentSettingAccess()->get(IDocumentSettingAccess::BROWSE_MODE); + const ViewShell *pSh = getRootFrm()->GetCurrShell(); + const sal_Bool bOn = !(pSh && pSh->GetViewOptions()->getBrowseMode()); if ( bOn && rH.IsActive() ) { //Header einsetzen, vorher entfernen falls vorhanden. @@ -725,7 +728,7 @@ void SwPageFrm::PrepareHeader() delete pDel; } OSL_ENSURE( pLay, "Wohin mit dem Header?" ); - SwHeaderFrm *pH = new SwHeaderFrm( (SwFrmFmt*)rH.GetHeaderFmt() ); + SwHeaderFrm *pH = new SwHeaderFrm( (SwFrmFmt*)rH.GetHeaderFmt(), this ); pH->Paste( this, pLay ); if ( GetUpper() ) ::RegistFlys( this, pH ); @@ -752,11 +755,12 @@ void SwPageFrm::PrepareFooter() if ( !pLay ) return; - const SwFmtFooter &rF = ((SwFrmFmt*)pRegisteredIn)->GetFooter(); + const SwFmtFooter &rF = ((SwFrmFmt*)GetRegisteredIn())->GetFooter(); while ( pLay->GetNext() ) pLay = (SwLayoutFrm*)pLay->GetNext(); - const sal_Bool bOn = !((SwFrmFmt*)pRegisteredIn)->getIDocumentSettingAccess()->get(IDocumentSettingAccess::BROWSE_MODE); + const ViewShell *pSh = getRootFrm()->GetCurrShell(); + const sal_Bool bOn = !(pSh && pSh->GetViewOptions()->getBrowseMode()); if ( bOn && rF.IsActive() ) { //Footer einsetzen, vorher entfernen falls vorhanden. @@ -770,7 +774,7 @@ void SwPageFrm::PrepareFooter() pLay->Cut(); delete pLay; } - SwFooterFrm *pF = new SwFooterFrm( (SwFrmFmt*)rF.GetFooterFmt() ); + SwFooterFrm *pF = new SwFooterFrm( (SwFrmFmt*)rF.GetFooterFmt(), this ); pF->Paste( this ); if ( GetUpper() ) ::RegistFlys( this, pF ); @@ -778,10 +782,10 @@ void SwPageFrm::PrepareFooter() else if ( pLay && pLay->IsFooterFrm() ) { //Footer entfernen falls vorhanden. ::DelFlys( pLay, this ); - ViewShell *pSh; - if ( pLay->GetPrev() && 0 != (pSh = GetShell()) && - pSh->VisArea().HasArea() ) - pSh->InvalidateWindows( pSh->VisArea() ); + ViewShell *pShell; + if ( pLay->GetPrev() && 0 != (pShell = getRootFrm()->GetCurrShell()) && + pShell->VisArea().HasArea() ) + pShell->InvalidateWindows( pShell->VisArea() ); pLay->Cut(); delete pLay; } diff --git a/sw/source/core/layout/layact.cxx b/sw/source/core/layout/layact.cxx index 0770717b258d..e19e086c8b47 100644 --- a/sw/source/core/layout/layact.cxx +++ b/sw/source/core/layout/layact.cxx @@ -413,7 +413,8 @@ sal_Bool SwLayAction::RemoveEmptyBrowserPages() //Beim umschalten vom normalen in den Browsermodus bleiben u.U. einige //unangenehm lange stehen. Diese beseiten wir mal schnell. sal_Bool bRet = sal_False; - if ( pRoot->GetFmt()->getIDocumentSettingAccess()->get(IDocumentSettingAccess::BROWSE_MODE) ) + const ViewShell *pSh = pRoot->GetCurrShell(); + if( pSh && pSh->GetViewOptions()->getBrowseMode() ) { SwPageFrm *pPage = (SwPageFrm*)pRoot->Lower(); do @@ -1159,7 +1160,8 @@ static const SwAnchoredObject* lcl_FindFirstInvaObj( const SwPageFrm* _pPage, sal_Bool SwLayAction::IsShortCut( SwPageFrm *&prPage ) { sal_Bool bRet = sal_False; - const sal_Bool bBrowse = pRoot->GetFmt()->getIDocumentSettingAccess()->get(IDocumentSettingAccess::BROWSE_MODE); + const ViewShell *pSh = pRoot->GetCurrShell(); + const sal_Bool bBrowse = pSh && pSh->GetViewOptions()->getBrowseMode(); //Wenn die Seite nicht Gueltig ist wird sie schnell formatiert, sonst //gibts nix als Aerger. @@ -1405,18 +1407,13 @@ sal_Bool SwLayAction::FormatLayout( SwLayoutFrm *pLay, sal_Bool bAddRect ) sal_Bool bNoPaint = sal_False; if ( pLay->IsPageBodyFrm() && pLay->Frm().Pos() == aOldRect.Pos() && - pLay->Lower() && - pLay->GetFmt()->getIDocumentSettingAccess()->get(IDocumentSettingAccess::BROWSE_MODE) ) + pLay->Lower() ) { - //HotFix: Vobis Homepage, nicht so genau hinsehen, sonst - //rpaints - + const ViewShell *pSh = pLay->getRootFrm()->GetCurrShell(); //Einschraenkungen wegen Kopf-/Fusszeilen - if ( !( pLay->IsCompletePaint() && - pLay->FindPageFrm()->FindFtnCont() ) ) - { + if( pSh && pSh->GetViewOptions()->getBrowseMode() && + !( pLay->IsCompletePaint() && pLay->FindPageFrm()->FindFtnCont() ) ) bNoPaint = sal_True; - } } if ( !bNoPaint && IsPaint() && bAddRect && (pLay->IsCompletePaint() || bChanged) ) @@ -1453,8 +1450,14 @@ sal_Bool SwLayAction::FormatLayout( SwLayoutFrm *pLay, sal_Bool bAddRect ) aPaint.Bottom( aPaint.Bottom() + nShadowWidth ); } - if ( pLay->IsPageFrm() && - pLay->GetFmt()->getIDocumentSettingAccess()->get(IDocumentSettingAccess::BROWSE_MODE) ) + sal_Bool bPageInBrowseMode = pLay->IsPageFrm(); + if( bPageInBrowseMode ) + { + const ViewShell *pSh = pLay->getRootFrm()->GetCurrShell(); + if( !pSh || !pSh->GetViewOptions()->getBrowseMode() ) + bPageInBrowseMode = sal_False; + } + if( bPageInBrowseMode ) { // NOTE: no vertical layout in online layout //Ist die Aenderung ueberhaupt sichtbar? @@ -1806,7 +1809,8 @@ sal_Bool SwLayAction::FormatLayoutTab( SwTabFrm *pTab, sal_Bool bAddRect ) sal_Bool SwLayAction::FormatCntnt( const SwPageFrm *pPage ) { const SwCntntFrm *pCntnt = pPage->ContainsCntnt(); - const sal_Bool bBrowse = pRoot->GetFmt()->getIDocumentSettingAccess()->get(IDocumentSettingAccess::BROWSE_MODE); + const ViewShell *pSh = pRoot->GetCurrShell(); + const sal_Bool bBrowse = pSh && pSh->GetViewOptions()->getBrowseMode(); while ( pCntnt && pPage->IsAnLower( pCntnt ) ) { diff --git a/sw/source/core/layout/laycache.cxx b/sw/source/core/layout/laycache.cxx index b0c49369ff2b..60ac1238c19c 100644 --- a/sw/source/core/layout/laycache.cxx +++ b/sw/source/core/layout/laycache.cxx @@ -56,6 +56,8 @@ #include <frmtool.hxx> #include <dflyobj.hxx> #include <dcontact.hxx> +#include "viewopt.hxx" +#include "viewsh.hxx" #include <flyfrm.hxx> // OD 2004-05-24 #i28701# #include <sortedobjs.hxx> @@ -187,7 +189,7 @@ sal_Bool SwLayCacheImpl::Read( SvStream& rStream ) void SwLayoutCache::Write( SvStream &rStream, const SwDoc& rDoc ) { - if( rDoc.GetRootFrm() ) // the layout itself .. + if( rDoc.GetCurrentLayout() ) // the layout itself .. //swmod 080218 { SwLayCacheIoImpl aIo( rStream, sal_True ); // We want to save the relative index, so we need the index @@ -195,7 +197,7 @@ void SwLayoutCache::Write( SvStream &rStream, const SwDoc& rDoc ) sal_uLong nStartOfContent = rDoc.GetNodes().GetEndOfContent(). StartOfSectionNode()->GetIndex(); // The first page.. - SwPageFrm* pPage = (SwPageFrm*)rDoc.GetRootFrm()->Lower(); + SwPageFrm* pPage = (SwPageFrm*)rDoc.GetCurrentLayout()->Lower(); //swmod 080218 aIo.OpenRec( SW_LAYCACHE_IO_REC_PAGES ); aIo.OpenFlagRec( 0, 0 ); @@ -348,13 +350,16 @@ void SwLayoutCache::Write( SvStream &rStream, const SwDoc& rDoc ) #if OSL_DEBUG_LEVEL > 1 sal_Bool SwLayoutCache::CompareLayout( const SwDoc& rDoc ) const { + if( !pImpl ) + return sal_True; + const SwRootFrm *pRootFrm = rDoc.GetCurrentLayout(); sal_Bool bRet = sal_True; - if( pImpl && rDoc.GetRootFrm() ) + if( pRootFrm ) { sal_uInt16 nIndex = 0; sal_uLong nStartOfContent = rDoc.GetNodes().GetEndOfContent(). StartOfSectionNode()->GetIndex(); - SwPageFrm* pPage = (SwPageFrm*)rDoc.GetRootFrm()->Lower(); + SwPageFrm* pPage = (SwPageFrm*)pRootFrm->Lower(); if( pPage ) pPage = (SwPageFrm*)pPage->GetNext(); while( pPage ) @@ -598,7 +603,10 @@ sal_uLong SwLayHelper::CalcPageCount() } if ( nNdCount < 1000 ) nPgCount = 0;// no progress bar for small documents - if ( pDoc->get(IDocumentSettingAccess::BROWSE_MODE) ) + ViewShell *pSh = 0; + if( rpLay && rpLay->getRootFrm() ) + pSh = rpLay->getRootFrm()->GetCurrShell(); + if( pSh && pSh->GetViewOptions()->getBrowseMode() ) nMaxParaPerPage *= 6; } } @@ -893,7 +901,7 @@ sal_Bool SwLayHelper::CheckInsert( sal_uLong nNodeIndex ) { OSL_ENSURE( pTab->GetTable()->GetTabLines()[ nRowIdx ], "Table ohne Zeilen?" ); pHeadline = - new SwRowFrm( *pTab->GetTable()->GetTabLines()[ nRowIdx ] ); + new SwRowFrm( *pTab->GetTable()->GetTabLines()[ nRowIdx ], pTab ); pHeadline->SetRepeatedHeadline( true ); pHeadline->InsertBefore( pFoll, 0 ); pHeadline->RegistFlys(); @@ -925,7 +933,7 @@ sal_Bool SwLayHelper::CheckInsert( sal_uLong nNodeIndex ) else { SwTxtFrm *pNew = new SwTxtFrm( ((SwTxtFrm*)rpFrm)-> - GetTxtNode() ); + GetTxtNode(), rpFrm ); pNew->_SetIsFollow( sal_True ); pNew->ManipOfst( nOfst ); pNew->SetFollow( ((SwTxtFrm*)rpFrm)->GetFollow() ); diff --git a/sw/source/core/layout/movedfwdfrmsbyobjpos.cxx b/sw/source/core/layout/movedfwdfrmsbyobjpos.cxx index 04802ae8710e..7ce3bf320579 100644 --- a/sw/source/core/layout/movedfwdfrmsbyobjpos.cxx +++ b/sw/source/core/layout/movedfwdfrmsbyobjpos.cxx @@ -30,11 +30,10 @@ #include "precompiled_sw.hxx" #include <movedfwdfrmsbyobjpos.hxx> #include <txtfrm.hxx> -// --> OD 2004-10-05 #i26945# #include <rowfrm.hxx> #include <pagefrm.hxx> #include <ndtxt.hxx> -// <-- +#include <switerator.hxx> SwMovedFwdFrmsByObjPos::SwMovedFwdFrmsByObjPos() { @@ -87,10 +86,8 @@ bool SwMovedFwdFrmsByObjPos::DoesRowContainMovedFwdFrm( const SwRowFrm& _rRowFrm const NodeMapEntry& rEntry = *(aIter); if ( rEntry.second >= nPageNumOfRow ) { - SwClientIter aFrmIter( *const_cast<SwTxtNode*>( rEntry.first ) ); - for( SwTxtFrm* pTxtFrm = (SwTxtFrm*)aFrmIter.First( TYPE(SwTxtFrm) ); - pTxtFrm; - pTxtFrm = (SwTxtFrm*)aFrmIter.Next() ) + SwIterator<SwTxtFrm,SwTxtNode> aFrmIter( *rEntry.first ); + for( SwTxtFrm* pTxtFrm = aFrmIter.First(); pTxtFrm; pTxtFrm = (SwTxtFrm*)aFrmIter.Next() ) { // --> OD 2004-12-03 #115759# - assure that found text frame // is the first one. diff --git a/sw/source/core/layout/newfrm.cxx b/sw/source/core/layout/newfrm.cxx index 0c6001c4f94a..faefa9c3e8b0 100644 --- a/sw/source/core/layout/newfrm.cxx +++ b/sw/source/core/layout/newfrm.cxx @@ -478,7 +478,7 @@ void InitCurrShells( SwRootFrm *pRoot ) SwRootFrm::SwRootFrm( SwFrmFmt *pFmt, ViewShell * pSh ) : SwLayoutFrm( pFmt->GetDoc()->MakeFrmFmt( - XubString( "Root", RTL_TEXTENCODING_MS_1252 ), pFmt ) ), + XubString( "Root", RTL_TEXTENCODING_MS_1252 ), pFmt ), 0 ), // --> PAGES01 maPagesArea(), mnViewWidth( -1 ), @@ -500,7 +500,11 @@ SwRootFrm::SwRootFrm( SwFrmFmt *pFmt, ViewShell * pSh ) : nType = FRMC_ROOT; bIdleFormat = bTurboAllowed = bAssertFlyPages = bIsNewLayout = sal_True; bCheckSuperfluous = bBrowseWidthValid = sal_False; + setRootFrm( this ); +} +void SwRootFrm::Init( SwFrmFmt* pFmt ) +{ InitCurrShells( this ); IDocumentTimerAccess *pTimerAccess = pFmt->getIDocumentTimerAccess(); @@ -508,14 +512,17 @@ SwRootFrm::SwRootFrm( SwFrmFmt *pFmt, ViewShell * pSh ) : IDocumentFieldsAccess *pFieldsAccess = pFmt->getIDocumentFieldsAccess(); const IDocumentSettingAccess *pSettingAccess = pFmt->getIDocumentSettingAccess(); pTimerAccess->StopIdling(); - pLayoutAccess->SetRootFrm( this ); //Fuer das Erzeugen der Flys durch MakeFrms() + pLayoutAccess->SetCurrentViewShell( this->GetCurrShell() ); //Fuer das Erzeugen der Flys durch MakeFrms() //swmod 071108//swmod 071225 bCallbackActionEnabled = sal_False; //vor Verlassen auf sal_True setzen! SdrModel *pMd = pFmt->getIDocumentDrawModelAccess()->GetDrawModel(); - if ( pMd ) { - pDrawPage = pMd->GetPage( 0 ); + // Disable "multiple layout" + pDrawPage = pMd->GetPage(0); //pMd->AllocPage( FALSE ); + //pMd->InsertPage( pDrawPage ); + // end of disabling + pDrawPage->SetSize( Frm().SSize() ); } @@ -602,8 +609,9 @@ SwRootFrm::~SwRootFrm() pTurbo = 0; if(pBlink) pBlink->FrmDelete( this ); - ((SwFrmFmt*)pRegisteredIn)->GetDoc()->DelFrmFmt( (SwFrmFmt*)pRegisteredIn ); + static_cast<SwFrmFmt*>(GetRegisteredInNonConst())->GetDoc()->DelFrmFmt( static_cast<SwFrmFmt*>(GetRegisteredInNonConst()) ); delete pDestroy; + pDestroy = 0; //Referenzen entfernen. for ( sal_uInt16 i = 0; i < pCurrShells->Count(); ++i ) @@ -633,6 +641,39 @@ void SwRootFrm::RemoveMasterObjs( SdrPage *pPg ) } +void SwRootFrm::AllCheckPageDescs() const +{ + CheckPageDescs( (SwPageFrm*)this->Lower() ); +} +//swmod 080226 +void SwRootFrm::AllInvalidateAutoCompleteWords() const +{ + SwPageFrm *pPage = (SwPageFrm*)this->Lower(); + while ( pPage ) + { + pPage->InvalidateAutoCompleteWords(); + pPage = (SwPageFrm*)pPage->GetNext(); + } +}//swmod 080305 +void SwRootFrm::AllAddPaintRect() const +{ + GetCurrShell()->AddPaintRect( this->Frm() ); +}//swmod 080305 +void SwRootFrm::AllRemoveFtns() +{ + RemoveFtns(); +} +void SwRootFrm::AllInvalidateSmartTagsOrSpelling(sal_Bool bSmartTags) const +{ + SwPageFrm *pPage = (SwPageFrm*)this->Lower(); + while ( pPage ) + { + if ( bSmartTags ) + pPage->InvalidateSmartTags(); + pPage->InvalidateSpelling(); + pPage = (SwPageFrm*)pPage->GetNext(); + } //swmod 080218 +} /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/source/core/layout/pagechg.cxx b/sw/source/core/layout/pagechg.cxx index a7b07bc8f3f1..948efb8452c5 100644 --- a/sw/source/core/layout/pagechg.cxx +++ b/sw/source/core/layout/pagechg.cxx @@ -47,6 +47,7 @@ #include <docsh.hxx> #include "viewimp.hxx" +#include "viewopt.hxx" #include "pagefrm.hxx" #include "rootfrm.hxx" #include "cntfrm.hxx" @@ -73,9 +74,8 @@ #include "poolfmt.hxx" #include <editeng/frmdiritem.hxx> #include <swfntcch.hxx> // SwFontAccess -// OD 2004-05-24 #i28701# #include <sortedobjs.hxx> - +#include <switerator.hxx> #include <vcl/svapp.hxx> using namespace ::com::sun::star; @@ -86,8 +86,8 @@ using namespace ::com::sun::star; |* SwBodyFrm::SwBodyFrm() |* |*************************************************************************/ -SwBodyFrm::SwBodyFrm( SwFrmFmt *pFmt ): - SwLayoutFrm( pFmt ) +SwBodyFrm::SwBodyFrm( SwFrmFmt *pFmt, SwFrm* pSib ): + SwLayoutFrm( pFmt, pSib ) { nType = FRMC_BODY; } @@ -204,8 +204,8 @@ void SwBodyFrm::Paint( const SwRect& rRect, const SwPrintData* ) const |* SwPageFrm::SwPageFrm(), ~SwPageFrm() |* |*************************************************************************/ -SwPageFrm::SwPageFrm( SwFrmFmt *pFmt, SwPageDesc *pPgDsc ) : - SwFtnBossFrm( pFmt ), +SwPageFrm::SwPageFrm( SwFrmFmt *pFmt, SwFrm* pSib, SwPageDesc *pPgDsc ) : + SwFtnBossFrm( pFmt, pSib ), pSortedObjs( 0 ), pDesc( pPgDsc ), nPhyPageNum( 0 ), @@ -229,12 +229,12 @@ SwPageFrm::SwPageFrm( SwFrmFmt *pFmt, SwPageDesc *pPgDsc ) : bInvalidLayout = bInvalidCntnt = bInvalidSpelling = bInvalidSmartTags = bInvalidAutoCmplWrds = bInvalidWordCount = sal_True; bInvalidFlyLayout = bInvalidFlyCntnt = bInvalidFlyInCnt = bFtnPage = bEndNotePage = sal_False; - const bool bBrowseMode = pFmt->getIDocumentSettingAccess()->get(IDocumentSettingAccess::BROWSE_MODE); + ViewShell *pSh = getRootFrm()->GetCurrShell(); + const bool bBrowseMode = pSh && pSh->GetViewOptions()->getBrowseMode(); if ( bBrowseMode ) { Frm().Height( 0 ); - ViewShell *pSh = GetShell(); - long nWidth = pSh ? pSh->VisArea().Width():0; + long nWidth = pSh->VisArea().Width(); if ( !nWidth ) nWidth = 5000L; //aendert sich sowieso Frm().Width ( nWidth ); @@ -249,7 +249,7 @@ SwPageFrm::SwPageFrm( SwFrmFmt *pFmt, SwPageDesc *pPgDsc ) : { bEmptyPage = sal_False; Calc(); //Damit die PrtArea stimmt. - SwBodyFrm *pBodyFrm = new SwBodyFrm( pDoc->GetDfltFrmFmt() ); + SwBodyFrm *pBodyFrm = new SwBodyFrm( pDoc->GetDfltFrmFmt(), this ); pBodyFrm->ChgSize( Prt().SSize() ); pBodyFrm->Paste( this ); pBodyFrm->Calc(); //Damit die Spalten korrekt @@ -299,7 +299,7 @@ SwPageFrm::~SwPageFrm() SwDoc *pDoc = GetFmt()->GetDoc(); if( pDoc && !pDoc->IsInDtor() ) { - ViewShell *pSh = GetShell(); + ViewShell *pSh = getRootFrm()->GetCurrShell(); if ( pSh ) { SwViewImp *pImp = pSh->Imp(); @@ -348,22 +348,33 @@ void SwPageFrm::CheckDirection( sal_Bool bVert ) ((SvxFrameDirectionItem&)GetFmt()->GetFmtAttr( RES_FRAMEDIR )).GetValue(); if( bVert ) { - if( FRMDIR_HORI_LEFT_TOP == nDir || FRMDIR_HORI_RIGHT_TOP == nDir || - GetFmt()->getIDocumentSettingAccess()->get(IDocumentSettingAccess::BROWSE_MODE) ) - //Badaa: 2008-04-18 * Support for Classical Mongolian Script (SCMS) joint with Jiayanmin + if( FRMDIR_HORI_LEFT_TOP == nDir || FRMDIR_HORI_RIGHT_TOP == nDir ) { - bVertical = 0; + //Badaa: 2008-04-18 * Support for Classical Mongolian Script (SCMS) joint with Jiayanmin bVertLR = 0; + bVertical = 0; } else { - bVertical = 1; - if(FRMDIR_VERT_TOP_RIGHT == nDir) + const ViewShell *pSh = getRootFrm()->GetCurrShell(); + if( pSh && pSh->GetViewOptions()->getBrowseMode() ) + { + //Badaa: 2008-04-18 * Support for Classical Mongolian Script (SCMS) joint with Jiayanmin bVertLR = 0; - else if(FRMDIR_VERT_TOP_LEFT==nDir) - bVertLR = 1; + bVertical = 0; + } + else + { + bVertical = 1; + //Badaa: 2008-04-18 * Support for Classical Mongolian Script (SCMS) joint with Jiayanmin + if(FRMDIR_VERT_TOP_RIGHT == nDir) + bVertLR = 0; + else if(FRMDIR_VERT_TOP_LEFT==nDir) + bVertLR = 1; + } } - bReverse = 0; + + bReverse = 0; bInvalidVert = 0; } else @@ -466,17 +477,15 @@ void MA_FASTCALL lcl_MakeObjs( const SwSpzFrmFmts &rTbl, SwPageFrm *pPage ) } else { - SwClientIter aIter( *pFmt ); - SwClient *pTmp = aIter.First( TYPE(SwFrm) ); - SwFlyFrm *pFly; - if ( pTmp ) + SwIterator<SwFlyFrm,SwFmt> aIter( *pFmt ); + SwFlyFrm *pFly = aIter.First(); + if ( pFly) { - pFly = (SwFlyFrm*)pTmp; if( pFly->GetAnchorFrm() ) pFly->AnchorFrm()->RemoveFly( pFly ); } else - pFly = new SwFlyLayFrm( (SwFlyFrmFmt*)pFmt, pPg ); + pFly = new SwFlyLayFrm( (SwFlyFrmFmt*)pFmt, pPg, pPg ); pPg->AppendFly( pFly ); ::RegistFlys( pPg, pFly ); } @@ -538,9 +547,9 @@ void SwPageFrm::PreparePage( sal_Bool bFtn ) |* SwPageFrm::Modify() |* |*************************************************************************/ -void SwPageFrm::Modify( SfxPoolItem * pOld, SfxPoolItem * pNew ) +void SwPageFrm::Modify( const SfxPoolItem* pOld, const SfxPoolItem * pNew ) { - ViewShell *pSh = GetShell(); + ViewShell *pSh = getRootFrm()->GetCurrShell(); if ( pSh ) pSh->SetFirstVisPageInvalid(); sal_uInt8 nInvFlags = 0; @@ -585,7 +594,7 @@ void SwPageFrm::Modify( SfxPoolItem * pOld, SfxPoolItem * pNew ) } } -void SwPageFrm::_UpdateAttr( SfxPoolItem *pOld, SfxPoolItem *pNew, +void SwPageFrm::_UpdateAttr( const SfxPoolItem *pOld, const SfxPoolItem *pNew, sal_uInt8 &rInvFlags, SwAttrSetChg *pOldSet, SwAttrSetChg *pNewSet ) { @@ -630,7 +639,8 @@ void SwPageFrm::_UpdateAttr( SfxPoolItem *pOld, SfxPoolItem *pNew, case RES_FRM_SIZE: { const SwRect aOldPageFrmRect( Frm() ); - if ( GetFmt()->getIDocumentSettingAccess()->get(IDocumentSettingAccess::BROWSE_MODE) ) + ViewShell *pSh = getRootFrm()->GetCurrShell(); + if( pSh && pSh->GetViewOptions()->getBrowseMode() ) { bValidSize = sal_False; // OD 28.10.2002 #97265# - Don't call <SwPageFrm::MakeAll()> @@ -658,8 +668,7 @@ void SwPageFrm::_UpdateAttr( SfxPoolItem *pOld, SfxPoolItem *pNew, static_cast<SwRootFrm*>(GetUpper())->CheckViewLayout( 0, 0 ); } //Window aufraeumen. - ViewShell *pSh; - if ( 0 != (pSh = GetShell()) && pSh->GetWin() && aOldPageFrmRect.HasArea() ) + if( pSh && pSh->GetWin() && aOldPageFrmRect.HasArea() ) { // OD 12.02.2003 #i9719#, #105645# - consider border and shadow of // page frame for determine 'old' rectangle - it's used for invalidating. @@ -791,7 +800,8 @@ SwPageDesc *SwPageFrm::FindPageDesc() SwPageDesc *pRet = 0; //5. - if ( GetFmt()->getIDocumentSettingAccess()->get(IDocumentSettingAccess::BROWSE_MODE) ) + const ViewShell *pSh = getRootFrm()->GetCurrShell(); + if( pSh && pSh->GetViewOptions()->getBrowseMode() ) { SwCntntFrm *pFrm = GetUpper()->ContainsCntnt(); while ( !pFrm->IsInDocBody() ) @@ -848,10 +858,13 @@ void AdjustSizeChgNotify( SwRootFrm *pRoot ) ViewShell *pSh = pRoot->GetCurrShell(); if ( pSh ) { - pSh->Imp()->NotifySizeChg( pRoot->Frm().SSize() );//Einmal fuer das Drawing. do { - pSh->SizeChgNotify(); //Einmal fuer jede Sicht. + if( pRoot == pSh->GetLayout() ) + { + pSh->SizeChgNotify(); + pSh->Imp()->NotifySizeChg( pRoot->Frm().SSize() ); + } pSh = (ViewShell*)pSh->GetNext(); } while ( pSh != pRoot->GetCurrShell() ); } @@ -874,7 +887,7 @@ void SwPageFrm::Cut() // PAGES01 //AdjustRootSize( CHG_CUTPAGE, 0 ); - ViewShell *pSh = GetShell(); + ViewShell *pSh = getRootFrm()->GetCurrShell(); if ( !IsEmptyPage() ) { if ( GetNext() ) @@ -977,9 +990,11 @@ void SwPageFrm::Paste( SwFrm* pParent, SwFrm* pSibling ) InvalidatePos(); + ViewShell *pSh = getRootFrm()->GetCurrShell(); + if ( pSh ) + pSh->SetFirstVisPageInvalid(); // PAGES01 - if ( GetUpper() ) - static_cast<SwRootFrm*>(GetUpper())->CheckViewLayout( 0, 0 ); + getRootFrm()->CheckViewLayout( 0, 0 ); } /************************************************************************* @@ -1055,7 +1070,7 @@ void SwFrm::CheckPageDescs( SwPageFrm *pStart, sal_Bool bNotifyFields ) { OSL_ENSURE( pStart, "Keine Startpage." ); - ViewShell *pSh = pStart->GetShell(); + ViewShell *pSh = pStart->getRootFrm()->GetCurrShell(); SwViewImp *pImp = pSh ? pSh->Imp() : 0; if ( pImp && pImp->IsAction() && !pImp->GetLayAction().IsCheckPages() ) @@ -1146,7 +1161,7 @@ void SwFrm::CheckPageDescs( SwPageFrm *pStart, sal_Bool bNotifyFields ) { if ( pPage->GetPrev() ) pDesc = ((SwPageFrm*)pPage->GetPrev())->GetPageDesc(); - SwPageFrm *pTmp = new SwPageFrm( pDoc->GetEmptyPageFmt(),pDesc); + SwPageFrm *pTmp = new SwPageFrm( pDoc->GetEmptyPageFmt(),pRoot,pDesc); pTmp->Paste( pRoot, pPage ); pTmp->PreparePage( sal_False ); pPage = pTmp; @@ -1301,7 +1316,7 @@ SwPageFrm *SwFrm::InsertPage( SwPageFrm *pPrevPage, sal_Bool bFtn ) if( bWishedOdd != bNextOdd ) { pFmt = pDoc->GetEmptyPageFmt(); SwPageDesc *pTmpDesc = pPrevPage->GetPageDesc(); - SwPageFrm *pPage = new SwPageFrm( pFmt, pTmpDesc ); + SwPageFrm *pPage = new SwPageFrm( pFmt, pRoot, pTmpDesc ); pPage->Paste( pRoot, pSibling ); pPage->PreparePage( bFtn ); //Wenn der Sibling keinen Bodytext enthaelt kann ich ihn vernichten @@ -1321,7 +1336,7 @@ SwPageFrm *SwFrm::InsertPage( SwPageFrm *pPrevPage, sal_Bool bFtn ) } pFmt = bWishedOdd ? pDesc->GetRightFmt() : pDesc->GetLeftFmt(); OSL_ENSURE( pFmt, "Descriptor without format." ); - SwPageFrm *pPage = new SwPageFrm( pFmt, pDesc ); + SwPageFrm *pPage = new SwPageFrm( pFmt, pRoot, pDesc ); pPage->Paste( pRoot, pSibling ); pPage->PreparePage( bFtn ); //Wenn der Sibling keinen Bodytext enthaelt kann ich ihn vernichten @@ -1344,7 +1359,7 @@ SwPageFrm *SwFrm::InsertPage( SwPageFrm *pPrevPage, sal_Bool bFtn ) if ( bCheckPages ) { CheckPageDescs( pSibling, sal_False ); - ViewShell *pSh = GetShell(); + ViewShell *pSh = getRootFrm()->GetCurrShell(); SwViewImp *pImp = pSh ? pSh->Imp() : 0; if ( pImp && pImp->IsAction() && !pImp->GetLayAction().IsCheckPages() ) { @@ -1361,7 +1376,7 @@ SwPageFrm *SwFrm::InsertPage( SwPageFrm *pPrevPage, sal_Bool bFtn ) //Fuer das Aktualisieren der Seitennummern-Felder gibt nDocPos //die Seitenposition an, _ab_ der invalidiert werden soll. - ViewShell *pSh = GetShell(); + ViewShell *pSh = getRootFrm()->GetCurrShell(); if ( !pSh || !pSh->Imp()->IsUpdateExpFlds() ) { SwDocPosUpdate aMsgHnt( pPrevPage->Frm().Top() ); @@ -1372,17 +1387,15 @@ SwPageFrm *SwFrm::InsertPage( SwPageFrm *pPrevPage, sal_Bool bFtn ) sw::sidebarwindows::SidebarPosition SwPageFrm::SidebarPosition() const { - if ( !GetShell() || - GetShell()->getIDocumentSettingAccess()->get(IDocumentSettingAccess::BROWSE_MODE) ) + ViewShell *pSh = getRootFrm()->GetCurrShell(); + if( !pSh || pSh->GetViewOptions()->getBrowseMode() ) { - // --> OD 2010-06-03 #i111964# - provide default sidebar position return sw::sidebarwindows::SIDEBAR_RIGHT; - // <-- } else { - const bool bLTR = GetUpper() ? static_cast<const SwRootFrm*>(GetUpper())->IsLeftToRightViewLayout() : true; - const bool bBookMode = GetShell()->GetViewOptions()->IsViewLayoutBookMode(); + const bool bLTR = getRootFrm()->IsLeftToRightViewLayout(); + const bool bBookMode = pSh->GetViewOptions()->IsViewLayoutBookMode(); const bool bRightSidebar = bLTR ? (!bBookMode || OnRightPage()) : (bBookMode && !OnRightPage()); return bRightSidebar @@ -1514,7 +1527,7 @@ void SwRootFrm::RemoveSuperfluous() } } while ( pPage ); - ViewShell *pSh = GetShell(); + ViewShell *pSh = getRootFrm()->GetCurrShell(); if ( nDocPos != LONG_MAX && (!pSh || !pSh->Imp()->IsUpdateExpFlds()) ) { @@ -1572,7 +1585,7 @@ void SwRootFrm::AssertFlyPages() { //Leerseite einfuegen, die Flys werden aber erst von //der naechsten Seite aufgenommen! - pPage = new SwPageFrm( pDoc->GetEmptyPageFmt(), pDesc ); + pPage = new SwPageFrm( pDoc->GetEmptyPageFmt(), this, pDesc ); pPage->Paste( this, pSibling ); pPage->PreparePage( sal_False ); bOdd = bOdd ? sal_False : sal_True; @@ -1580,7 +1593,7 @@ void SwRootFrm::AssertFlyPages() } pPage = new SwPageFrm( (bOdd ? pDesc->GetRightFmt() : - pDesc->GetLeftFmt()), pDesc ); + pDesc->GetLeftFmt()), this, pDesc ); pPage->Paste( this, pSibling ); pPage->PreparePage( sal_False ); bOdd = bOdd ? sal_False : sal_True; @@ -1643,12 +1656,12 @@ void SwRootFrm::AssertPageFlys( SwPageFrm *pPage ) //einfach ein Modify mit seinem AnkerAttr schicken. #if OSL_DEBUG_LEVEL > 1 const sal_uInt32 nCnt = pPage->GetSortedObjs()->Count(); - rFmt.SwModify::Modify( 0, (SwFmtAnchor*)&rAnch ); + rFmt.NotifyClients( 0, (SwFmtAnchor*)&rAnch ); OSL_ENSURE( !pPage->GetSortedObjs() || nCnt != pPage->GetSortedObjs()->Count(), - "Kann das Obj nicht umhaengen." ); + "Object couldn't be reattached!" ); #else - rFmt.SwModify::Modify( 0, (SwFmtAnchor*)&rAnch ); + rFmt.NotifyClients( 0, (SwFmtAnchor*)&rAnch ); #endif --i; } @@ -1716,7 +1729,7 @@ void SwRootFrm::ImplInvalidateBrowseWidth() |*************************************************************************/ void SwRootFrm::ImplCalcBrowseWidth() { - OSL_ENSURE( GetFmt()->getIDocumentSettingAccess()->get(IDocumentSettingAccess::BROWSE_MODE), + OSL_ENSURE( GetCurrShell() && GetCurrShell()->GetViewOptions()->getBrowseMode(), "CalcBrowseWidth and not in BrowseView" ); //Die (minimale) Breite wird von Rahmen, Tabellen und Zeichenobjekten @@ -1734,7 +1747,7 @@ void SwRootFrm::ImplCalcBrowseWidth() return; bBrowseWidthValid = sal_True; - ViewShell *pSh = GetShell(); + ViewShell *pSh = getRootFrm()->GetCurrShell(); nBrowseWidth = pSh ? MINLAY + 2 * pSh->GetOut()-> PixelToLogic( pSh->GetBrowseBorder() ).Width() @@ -1981,7 +1994,8 @@ void lcl_MoveAllLowerObjs( SwFrm* pFrm, const Point& rOffset ) if ( pFlyFrm->Lower()->IsNoTxtFrm() ) { SwCntntFrm* pCntntFrm = static_cast<SwCntntFrm*>(pFlyFrm->Lower()); - ViewShell *pSh = pFlyFrm->Lower()->GetShell(); + SwRootFrm* pRoot = pFlyFrm->Lower()->getRootFrm(); + ViewShell *pSh = pRoot ? pRoot->GetCurrShell() : 0; if ( pSh ) { SwOLENode* pNode = pCntntFrm->GetNode()->GetOLENode(); @@ -2036,7 +2050,7 @@ void lcl_MoveAllLowers( SwFrm* pFrm, const Point& rOffset ) // Don't forget accessibility: if( pFrm->IsAccessibleFrm() ) { - SwRootFrm *pRootFrm = pFrm->FindRootFrm(); + SwRootFrm *pRootFrm = pFrm->getRootFrm(); if( pRootFrm && pRootFrm->IsAnyShellAccessible() && pRootFrm->GetCurrShell() ) { @@ -2135,7 +2149,7 @@ void SwRootFrm::CheckViewLayout( const SwViewOption* pViewOpt, const SwRect* pVi bool bPageChanged = false; const bool bRTL = !IsLeftToRightViewLayout(); - const SwTwips nSidebarWidth = SwPageFrm::GetSidebarBorderWidth( GetShell() ); + const SwTwips nSidebarWidth = SwPageFrm::GetSidebarBorderWidth( GetCurrShell() ); while ( pPageFrm ) { @@ -2371,7 +2385,7 @@ void SwRootFrm::CheckViewLayout( const SwViewOption* pViewOpt, const SwRect* pVi ::AdjustSizeChgNotify( this ); Calc(); - ViewShell* pSh = GetShell(); + ViewShell* pSh = GetCurrShell(); if ( pSh && pSh->GetDoc()->GetDocShell() ) { diff --git a/sw/source/core/layout/pagedesc.cxx b/sw/source/core/layout/pagedesc.cxx index 0ba954b226ca..a77064687d74 100644 --- a/sw/source/core/layout/pagedesc.cxx +++ b/sw/source/core/layout/pagedesc.cxx @@ -51,6 +51,7 @@ #include <frmtool.hxx> #include <doc.hxx> // fuer GetAttrPool #include <poolfmt.hxx> +#include <switerator.hxx> /************************************************************************* |* @@ -240,20 +241,18 @@ void SwPageDesc::RegisterChange() nRegHeight = 0; { - SwClientIter aIter( GetMaster() ); - for( SwClient* pLast = aIter.First(TYPE(SwFrm)); pLast; - pLast = aIter.Next() ) + SwIterator<SwFrm,SwFmt> aIter( GetMaster() ); + for( SwFrm* pLast = aIter.First(); pLast; pLast = aIter.Next() ) { - if( ((SwFrm*)pLast)->IsPageFrm() ) + if( pLast->IsPageFrm() ) ((SwPageFrm*)pLast)->PrepareRegisterChg(); } } { - SwClientIter aIter( GetLeft() ); - for( SwClient* pLast = aIter.First(TYPE(SwFrm)); pLast; - pLast = aIter.Next() ) + SwIterator<SwFrm,SwFmt> aIter( GetLeft() ); + for( SwFrm* pLast = aIter.First(); pLast; pLast = aIter.Next() ) { - if( ((SwFrm*)pLast)->IsPageFrm() ) + if( pLast->IsPageFrm() ) ((SwPageFrm*)pLast)->PrepareRegisterChg(); } } @@ -269,10 +268,10 @@ void SwPageDesc::RegisterChange() *************************************************************************/ -void SwPageDesc::Modify( SfxPoolItem *pOld, SfxPoolItem *pNew ) +void SwPageDesc::Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew ) { const sal_uInt16 nWhich = pOld ? pOld->Which() : pNew ? pNew->Which() : 0; - SwModify::Modify( pOld, pNew ); + NotifyClients( pOld, pNew ); if ( (RES_ATTRSET_CHG == nWhich) || (RES_FMT_CHG == nWhich) || isCHRATR(nWhich) || (RES_PARATR_LINESPACING == nWhich) ) @@ -299,7 +298,7 @@ static const SwFrm* lcl_GetFrmOfNode( const SwNode& rNd ) pMod = 0; Point aNullPt; - return pMod ? ::GetFrmOfModify( *pMod, nFrmType, &aNullPt, 0, sal_False ) + return pMod ? ::GetFrmOfModify( 0, *pMod, nFrmType, &aNullPt, 0, sal_False ) : 0; } @@ -324,14 +323,12 @@ const SwFrmFmt* SwPageDesc::GetPageFmtOfNode( const SwNode& rNd, const SwPageDesc* pPd = bCheckForThisPgDc ? this : ((SwPageFrm*)pChkFrm)->GetPageDesc(); pRet = &pPd->GetMaster(); - OSL_ENSURE( ((SwPageFrm*)pChkFrm)->GetPageDesc() == pPd, - "Falcher Node fuers erkennen des Seitenformats" ); + OSL_ENSURE( ((SwPageFrm*)pChkFrm)->GetPageDesc() == pPd, "Wrong node for detection of page format!" ); // an welchem Format haengt diese Seite? - if( pRet != pChkFrm->GetRegisteredIn() ) + if( !pChkFrm->KnowsFormat(*pRet) ) { pRet = &pPd->GetLeft(); - OSL_ENSURE( pRet == pChkFrm->GetRegisteredIn(), - "Falcher Node fuers erkennen des Seitenformats" ); + OSL_ENSURE( pChkFrm->KnowsFormat(*pRet), "Wrong node for detection of page format!" ); } } else diff --git a/sw/source/core/layout/paintfrm.cxx b/sw/source/core/layout/paintfrm.cxx index 0bce7b329df4..0ad768cd930b 100644 --- a/sw/source/core/layout/paintfrm.cxx +++ b/sw/source/core/layout/paintfrm.cxx @@ -30,7 +30,7 @@ #include "precompiled_sw.hxx" #include <com/sun/star/text/HoriOrientation.hpp> - +#include <hintids.hxx> #include <vcl/sound.hxx> #include <tools/poly.hxx> #include <svl/svstdarr.hxx> @@ -41,13 +41,11 @@ #include <editeng/prntitem.hxx> #include <editeng/boxitem.hxx> #include <editeng/shaditem.hxx> -// --> collapsing borders FME 2005-05-27 #i29550# #include <svx/framelink.hxx> -// <-- #include <vcl/graph.hxx> #include <svx/svdpagv.hxx> #include <tgrditem.hxx> - +#include <switerator.hxx> #include <fmtsrnd.hxx> #include <fmtclds.hxx> #include <tools/shl.hxx> @@ -82,28 +80,20 @@ #include <lineinfo.hxx> #include <dbg_lay.hxx> #include <accessibilityoptions.hxx> -// OD 20.12.2002 #94627# #include <docsh.hxx> -// OD 28.02.2003 #b4779636#, #107692# #include <swtable.hxx> -// OD 02.07.2003 #108784# #include <svx/svdogrp.hxx> -// OD 2004-05-24 #i28701# #include <sortedobjs.hxx> - -// --> FME 2004-06-08 #i12836# enhanced pdf export #include <EnhancedPDFExportHelper.hxx> -// <-- - #include <ndole.hxx> #include <svtools/chartprettypainter.hxx> - #include <PostItMgr.hxx> #include <tools/color.hxx> +#include <vcl/svapp.hxx> + #define COL_NOTES_SIDEPANE RGB_COLORDATA(230,230,230) #define COL_NOTES_SIDEPANE_BORDER RGB_COLORDATA(200,200,200) #define COL_NOTES_SIDEPANE_SCROLLAREA RGB_COLORDATA(230,230,220) -#include <vcl/svapp.hxx> #include <svtools/borderhelper.hxx> @@ -3160,7 +3150,7 @@ SwShortCut::SwShortCut( const SwFrm& rFrm, const SwRect& rRect ) void SwLayoutFrm::Paint(SwRect const& rRect, SwPrintData const*const) const { - ViewShell *pSh = GetShell(); + ViewShell *pSh = getRootFrm()->GetCurrShell(); // --> FME 2004-06-24 #i16816# tagged pdf support Frm_Info aFrmInfo( *this ); @@ -3587,8 +3577,8 @@ void SwFlyFrm::Paint(SwRect const& rRect, SwPrintData const*const) const // used in <SwNoTxtFrm::Paint(..)> to set the clip region // for painting the graphic/OLE. Thus, the clip region is // also applied for the PDF export. - ViewShell *pSh = GetShell(); - if ( !pOut->GetConnectMetaFile() || !pSh->GetWin() ) + ViewShell *pSh = getRootFrm()->GetCurrShell(); + if ( !pOut->GetConnectMetaFile() || !pSh || !pSh->GetWin() ) // <-- { pOut->SetClipRegion( aPoly ); @@ -4586,10 +4576,10 @@ void SwFrm::ProcessPrimitives( const drawinglayer::primitive2d::Primitive2DSeque { basegfx::B2DRange aViewRange; - SdrPage *pDrawPage = GetShell( )->Imp( )->GetPageView( )->GetPage( ); + SdrPage *pDrawPage = getRootFrm()->GetCurrShell()->Imp()->GetPageView()->GetPage(); const drawinglayer::geometry::ViewInformation2D aNewViewInfos( basegfx::B2DHomMatrix( ), - GetShell( )->GetOut( )->GetViewTransformation( ), + getRootFrm()->GetCurrShell()->GetOut()->GetViewTransformation(), aViewRange, GetXDrawPageForSdrPage( pDrawPage ), 0.0, @@ -4597,7 +4587,7 @@ void SwFrm::ProcessPrimitives( const drawinglayer::primitive2d::Primitive2DSeque drawinglayer::processor2d::BaseProcessor2D * pProcessor2D = sdr::contact::createBaseProcessor2DFromOutputDevice( - *GetShell( )->GetOut( ), + *getRootFrm()->GetCurrShell()->GetOut(), aNewViewInfos ); if ( pProcessor2D ) @@ -5187,7 +5177,7 @@ void SwPageFrm::PaintMarginArea( const SwRect& _rOutputRect, ViewShell* _pViewShell ) const { if ( _pViewShell->GetWin() && - !_pViewShell->getIDocumentSettingAccess()->get(IDocumentSettingAccess::BROWSE_MODE) ) + !_pViewShell->GetViewOptions()->getBrowseMode() ) { SwRect aPgPrtRect( Prt() ); aPgPrtRect.Pos() += Frm().Pos(); @@ -5678,8 +5668,7 @@ void SwFrm::PaintBackground( const SwRect &rRect, const SwPageFrm *pPage, { if ( bBack || bPageFrm || !bLowerMode ) { - const sal_Bool bBrowse = pSh->getIDocumentSettingAccess()->get(IDocumentSettingAccess::BROWSE_MODE); - + const sal_Bool bBrowse = pSh->GetViewOptions()->getBrowseMode(); SwRect aRect; if ( (bPageFrm && bBrowse) || (IsTxtFrm() && Prt().SSize() == Frm().SSize()) ) @@ -6320,7 +6309,7 @@ void SwFrm::Retouche( const SwPageFrm * pPage, const SwRect &rRect ) const return; OSL_ENSURE( GetUpper(), "Retoucheversuch ohne Upper." ); - OSL_ENSURE( GetShell() && pGlobalShell->GetWin(), "Retouche auf dem Drucker?" ); + OSL_ENSURE( getRootFrm()->GetCurrShell() && pGlobalShell->GetWin(), "Retouche auf dem Drucker?" ); SwRect aRetouche( GetUpper()->PaintArea() ); aRetouche.Top( Frm().Top() + Frm().Height() ); @@ -6332,7 +6321,7 @@ void SwFrm::Retouche( const SwPageFrm * pPage, const SwRect &rRect ) const //zum ausstanzen. SwRegionRects aRegion( aRetouche ); aRegion -= rRect; - ViewShell *pSh = GetShell(); + ViewShell *pSh = getRootFrm()->GetCurrShell(); // --> FME 2004-06-24 #i16816# tagged pdf support SwTaggedPDFHelper aTaggedPDFHelper( 0, 0, 0, *pSh->GetOut() ); @@ -6423,7 +6412,7 @@ sal_Bool SwFrm::GetBackgroundBrush( const SvxBrushItem* & rpBrush, sal_Bool bLowerMode ) const { const SwFrm *pFrm = this; - ViewShell *pSh = GetShell(); + ViewShell *pSh = getRootFrm()->GetCurrShell(); const SwViewOption *pOpt = pSh->GetViewOptions(); rpBrush = 0; rpCol = NULL; @@ -6479,7 +6468,7 @@ sal_Bool SwFrm::GetBackgroundBrush( const SvxBrushItem* & rpBrush, { rpBrush = &rBack; if ( pFrm->IsPageFrm() && - pSh->getIDocumentSettingAccess()->get(IDocumentSettingAccess::BROWSE_MODE) ) + pSh->GetViewOptions()->getBrowseMode() ) rOrigRect = pFrm->Frm(); else { @@ -6538,10 +6527,10 @@ Graphic SwFlyFrmFmt::MakeGraphic( ImageMap* pMap ) { Graphic aRet; //irgendeinen Fly suchen! - SwClientIter aIter( *this ); - SwClient *pFirst = aIter.First( TYPE(SwFrm) ); + SwIterator<SwFrm,SwFmt> aIter( *this ); + SwFrm *pFirst = aIter.First(); ViewShell *pSh; - if ( pFirst && 0 != ( pSh = ((SwFrm*)pFirst)->GetShell()) ) + if ( pFirst && 0 != ( pSh = pFirst->getRootFrm()->GetCurrShell()) ) { ViewShell *pOldGlobal = pGlobalShell; pGlobalShell = pSh; diff --git a/sw/source/core/layout/sectfrm.cxx b/sw/source/core/layout/sectfrm.cxx index cce8ff9b8318..d7f5364c38f7 100644 --- a/sw/source/core/layout/sectfrm.cxx +++ b/sw/source/core/layout/sectfrm.cxx @@ -29,7 +29,7 @@ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_sw.hxx" - +#include <svl/smplhint.hxx> #include <svl/itemiter.hxx> #include <hints.hxx> #include <txtftn.hxx> @@ -55,6 +55,7 @@ #include "layouter.hxx" // SwLayouter #include "dbg_lay.hxx" #include "viewsh.hxx" +#include "viewopt.hxx" #include "viewimp.hxx" #include <editeng/ulspitem.hxx> #include <editeng/lrspitem.hxx> @@ -72,8 +73,8 @@ SV_IMPL_PTRARR_SORT( SwDestroyList, SwSectionFrmPtr ) |* SwSectionFrm::SwSectionFrm(), ~SwSectionFrm() |* |*************************************************************************/ -SwSectionFrm::SwSectionFrm( SwSection &rSect ) : - SwLayoutFrm( rSect.GetFmt() ), +SwSectionFrm::SwSectionFrm( SwSection &rSect, SwFrm* pSib ) : + SwLayoutFrm( rSect.GetFmt(), pSib ), SwFlowFrm( (SwFrm&)*this ), pSection( &rSect ) { @@ -84,7 +85,7 @@ SwSectionFrm::SwSectionFrm( SwSection &rSect ) : } SwSectionFrm::SwSectionFrm( SwSectionFrm &rSect, sal_Bool bMaster ) : - SwLayoutFrm( rSect.GetFmt() ), + SwLayoutFrm( rSect.GetFmt(), rSect.getRootFrm() ), SwFlowFrm( (SwFrm&)*this ), pSection( rSect.GetSection() ) { @@ -150,9 +151,9 @@ SwSectionFrm::~SwSectionFrm() { if( GetFmt() && !GetFmt()->GetDoc()->IsInDtor() ) { - SwRootFrm *pRootFrm = GetFmt()->GetDoc()->GetRootFrm(); + SwRootFrm *pRootFrm = getRootFrm(); if( pRootFrm ) - pRootFrm->RemoveFromList( this ); + pRootFrm->RemoveFromList( this ); //swmod 071108//swmod 071225 if( IsFollow() ) { SwSectionFrm *pMaster = FindMaster(); @@ -197,7 +198,7 @@ void SwSectionFrm::DelEmpty( sal_Bool bRemove ) // Relation CONTENT_FLOWS_FROM for current next paragraph will change // and relation CONTENT_FLOWS_TO for current previous paragraph will change. { - ViewShell* pViewShell( GetShell() ); + ViewShell* pViewShell( getRootFrm()->GetCurrShell() ); if ( pViewShell && pViewShell->GetLayout() && pViewShell->GetLayout()->IsAnyShellAccessible() ) { @@ -232,11 +233,11 @@ void SwSectionFrm::DelEmpty( sal_Bool bRemove ) { // Wenn wir bereits halbtot waren vor diesem DelEmpty, so // stehen wir vermutlich auch in der Liste und muessen uns // dort austragen - if( !pSection ) - GetFmt()->GetDoc()->GetRootFrm()->RemoveFromList( this ); + if( !pSection && getRootFrm() ) + getRootFrm()->RemoveFromList( this ); } - else - GetFmt()->GetDoc()->GetRootFrm()->InsertEmptySct( this ); + else if( getRootFrm() ) + getRootFrm()->InsertEmptySct( this ); //swmod 071108//swmod 071225 pSection = NULL; // damit ist allerdings eine Reanimierung quasi ausgeschlossen } } @@ -387,7 +388,7 @@ void SwSectionFrm::Paste( SwFrm* pParent, SwFrm* pSibling ) } } pParent = pSect; - pSect = new SwSectionFrm( *((SwSectionFrm*)pParent)->GetSection() ); + pSect = new SwSectionFrm( *((SwSectionFrm*)pParent)->GetSection(), pParent ); // Wenn pParent in zwei Teile zerlegt wird, so muss sein Follow am // neuen, zweiten Teil angebracht werden. pSect->SetFollow( ((SwSectionFrm*)pParent)->GetFollow() ); @@ -538,7 +539,7 @@ sal_Bool SwSectionFrm::SplitSect( SwFrm* pFrm, sal_Bool bApres ) OSL_ENSURE( pSav, "SplitSect: What's on?" ); if( pSav ) // Robust { // Einen neuen SctFrm anlegen, nicht als Follow/Master - SwSectionFrm* pNew = new SwSectionFrm( *pSect->GetSection() ); + SwSectionFrm* pNew = new SwSectionFrm( *pSect->GetSection(), pSect ); pNew->InsertBehind( pSect->GetUpper(), pSect ); pNew->Init(); SWRECTFN( this ) @@ -729,7 +730,7 @@ void SwSectionFrm::MoveCntntAndDelete( SwSectionFrm* pDel, sal_Bool bSave ) // vom gleichen Parent abgeleitet ist. // Dann gibt es (noch) keinen Teil unseres Parents, der den Inhalt // aufnehmen kann,also bauen wir ihn uns. - pPrvSct = new SwSectionFrm( *pParent->GetSection() ); + pPrvSct = new SwSectionFrm( *pParent->GetSection(), pUp ); pPrvSct->InsertBehind( pUp, pPrv ); pPrvSct->Init(); SWRECTFN( pUp ) @@ -764,7 +765,7 @@ void SwSectionFrm::MakeAll() if( !pSection ) // Durch DelEmpty { #if OSL_DEBUG_LEVEL > 1 - OSL_ENSURE( GetFmt()->GetDoc()->GetRootFrm()->IsInDelList( this ), "SectionFrm without Section" ); + OSL_ENSURE( getRootFrm()->IsInDelList( this ), "SectionFrm without Section" ); #endif if( !bValidPos ) { @@ -789,7 +790,8 @@ void SwSectionFrm::MakeAll() // OD 2004-03-15 #116561# - In online layout join the follows, if section // can grow. - if ( GetFmt()->getIDocumentSettingAccess()->get(IDocumentSettingAccess::BROWSE_MODE) && + const ViewShell *pSh = getRootFrm()->GetCurrShell(); + if( pSh && pSh->GetViewOptions()->getBrowseMode() && ( Grow( LONG_MAX, true ) > 0 ) ) { while( GetFollow() ) @@ -1307,8 +1309,7 @@ void SwSectionFrm::Format( const SwBorderAttrs *pAttr ) if( !pSection ) // Durch DelEmpty { #if OSL_DEBUG_LEVEL > 1 - OSL_ENSURE( GetFmt()->GetDoc()->GetRootFrm()->IsInDelList( this ), - "SectionFrm without Section" ); + OSL_ENSURE( getRootFrm()->IsInDelList( this ), "SectionFrm without Section" ); #endif bValidSize = bValidPos = bValidPrtArea = sal_True; return; @@ -1385,7 +1386,8 @@ void SwSectionFrm::Format( const SwBorderAttrs *pAttr ) // OD 15.10.2002 #103517# - allow grow in online layout // Thus, set <..IsBrowseMode()> as parameter <bGrow> on calling // method <_CheckClipping(..)>. - _CheckClipping( GetFmt()->getIDocumentSettingAccess()->get(IDocumentSettingAccess::BROWSE_MODE), bMaximize ); + const ViewShell *pSh = getRootFrm()->GetCurrShell(); + _CheckClipping( pSh && pSh->GetViewOptions()->getBrowseMode(), bMaximize ); bMaximize = ToMaximize( sal_False ); bValidSize = sal_True; } @@ -2010,9 +2012,14 @@ SwTwips SwSectionFrm::_Grow( SwTwips nDist, sal_Bool bTst ) sal_Bool bInCalcCntnt = GetUpper() && IsInFly() && FindFlyFrm()->IsLocked(); // OD 2004-03-15 #116561# - allow grow in online layout - if ( !Lower() || !Lower()->IsColumnFrm() || !Lower()->GetNext() || - GetSection()->GetFmt()->GetBalancedColumns().GetValue() || - GetFmt()->getIDocumentSettingAccess()->get(IDocumentSettingAccess::BROWSE_MODE) ) + sal_Bool bGrow = !Lower() || !Lower()->IsColumnFrm() || !Lower()->GetNext() || + GetSection()->GetFmt()->GetBalancedColumns().GetValue(); + if( !bGrow ) + { + const ViewShell *pSh = getRootFrm()->GetCurrShell(); + bGrow = pSh && pSh->GetViewOptions()->getBrowseMode(); + } + if( bGrow ) { SwTwips nGrow; if( IsInFtn() ) @@ -2397,7 +2404,7 @@ void SwSectionFrm::CalcEndAtEndFlag() |* |*************************************************************************/ -void SwSectionFrm::Modify( SfxPoolItem * pOld, SfxPoolItem * pNew ) +void SwSectionFrm::Modify( const SfxPoolItem* pOld, const SfxPoolItem * pNew ) { sal_uInt8 nInvFlags = 0; @@ -2432,7 +2439,16 @@ void SwSectionFrm::Modify( SfxPoolItem * pOld, SfxPoolItem * pNew ) } } -void SwSectionFrm::_UpdateAttr( SfxPoolItem *pOld, SfxPoolItem *pNew, +void SwSectionFrm::SwClientNotify( const SwModify& rMod, const SfxHint& rHint ) +{ + const SfxSimpleHint* pSimpleHint = dynamic_cast<const SfxSimpleHint*>(&rHint); + if ( pSimpleHint && pSimpleHint->GetId() == SFX_HINT_DYING && &rMod == GetRegisteredIn() ) + { + SwSectionFrm::MoveCntntAndDelete( this, sal_True ); + } +} + +void SwSectionFrm::_UpdateAttr( const SfxPoolItem *pOld, const SfxPoolItem *pNew, sal_uInt8 &rInvFlags, SwAttrSetChg *pOldSet, SwAttrSetChg *pNewSet ) { @@ -2523,7 +2539,7 @@ void SwSectionFrm::_UpdateAttr( SfxPoolItem *pOld, SfxPoolItem *pNew, case RES_PROTECT: { - ViewShell *pSh = GetShell(); + ViewShell *pSh = getRootFrm()->GetCurrShell(); if( pSh && pSh->GetLayout()->IsAnyShellAccessible() ) pSh->Imp()->InvalidateAccessibleEditableState( sal_True, this ); } @@ -2717,7 +2733,7 @@ void SwRootFrm::_DeleteEmptySct() if( pUp && !pUp->Lower() ) { if( pUp->IsPageBodyFrm() ) - pUp->FindRootFrm()->SetSuperfluous(); + pUp->getRootFrm()->SetSuperfluous(); else if( pUp->IsFtnFrm() && !pUp->IsColLocked() && pUp->GetUpper() ) { diff --git a/sw/source/core/layout/softpagebreak.cxx b/sw/source/core/layout/softpagebreak.cxx index b55a7f43dd0a..c27bd3753637 100644 --- a/sw/source/core/layout/softpagebreak.cxx +++ b/sw/source/core/layout/softpagebreak.cxx @@ -36,12 +36,12 @@ #include "frmfmt.hxx" #include "rowfrm.hxx" #include "tabfrm.hxx" +#include "switerator.hxx" void SwTxtNode::fillSoftPageBreakList( SwSoftPageBreakList& rBreak ) const { - SwClientIter aIter( const_cast<SwTxtNode&>(*this) ); - for( const SwTxtFrm *pFrm = (const SwTxtFrm*)aIter.First( TYPE(SwTxtFrm) ); - pFrm; pFrm = (const SwTxtFrm*)aIter.Next() ) + SwIterator<SwTxtFrm,SwTxtNode> aIter( *this ); + for( const SwTxtFrm *pFrm = aIter.First(); pFrm; pFrm = aIter.Next() ) { // No soft page break in header or footer if( pFrm->FindFooterOrHeader() || pFrm->IsInFly() ) @@ -111,13 +111,12 @@ bool SwTableLine::hasSoftPageBreak() const // No soft page break for sub tables if( GetUpper() || !GetFrmFmt() ) return false; - SwClientIter aIter( *GetFrmFmt() ); - for( SwClient* pLast = aIter.First( TYPE( SwFrm ) ); pLast; - pLast = aIter.Next() ) + SwIterator<SwRowFrm,SwFmt> aIter( *GetFrmFmt() ); + for( SwRowFrm* pLast = aIter.First(); pLast; pLast = aIter.Next() ) { - if( ((SwRowFrm*)pLast)->GetTabLine() == this ) + if( pLast->GetTabLine() == this ) { - const SwTabFrm* pTab = static_cast<SwRowFrm*>(pLast)->FindTabFrm(); + const SwTabFrm* pTab = pLast->FindTabFrm(); // No soft page break for // tables with prevs, i.e. if the frame is not the first in its layout frame // tables in footer or header diff --git a/sw/source/core/layout/ssfrm.cxx b/sw/source/core/layout/ssfrm.cxx index 56b65c7bfd48..1bfaa40c7ae8 100644 --- a/sw/source/core/layout/ssfrm.cxx +++ b/sw/source/core/layout/ssfrm.cxx @@ -29,7 +29,7 @@ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_sw.hxx" - +#include <ftnfrm.hxx> #include <pagefrm.hxx> #include <rootfrm.hxx> #include <cntfrm.hxx> @@ -54,10 +54,9 @@ #include <fmtclds.hxx> #include <viewsh.hxx> #include <viewimp.hxx> - -// OD 2004-05-24 #i28701# #include <sortedobjs.hxx> #include <hints.hxx> +#include <switerator.hxx> // No inline cause we need the function pointers long SwFrm::GetTopMargin() const @@ -366,14 +365,13 @@ Point SwFrm::GetFrmAnchorPos( sal_Bool bIgnoreFlysAnchoredAtThisFrame ) const |* |*************************************************************************/ - SwFrm::~SwFrm() { // accessible objects for fly and cell frames have been already disposed // by the destructors of the derived classes. if( IsAccessibleFrm() && !(IsFlyFrm() || IsCellFrm()) && GetDep() ) { - SwRootFrm *pRootFrm = FindRootFrm(); + SwRootFrm *pRootFrm = getRootFrm(); if( pRootFrm && pRootFrm->IsAnyShellAccessible() ) { ViewShell *pVSh = pRootFrm->GetCurrShell(); @@ -442,15 +440,15 @@ void SwLayoutFrm::SetFrmFmt( SwFrmFmt *pNew ) SwFmtChg aOldFmt( GetFmt() ); pNew->Add( this ); SwFmtChg aNewFmt( pNew ); - Modify( &aOldFmt, &aNewFmt ); + ModifyNotification( &aOldFmt, &aNewFmt ); } } /************************************************************************* |* SwCntntFrm::SwCntntFrm() |*************************************************************************/ -SwCntntFrm::SwCntntFrm( SwCntntNode * const pCntnt ) : - SwFrm( pCntnt ), +SwCntntFrm::SwCntntFrm( SwCntntNode * const pCntnt, SwFrm* pSib ) : + SwFrm( pCntnt, pSib ), SwFlowFrm( (SwFrm&)*this ) { } @@ -461,11 +459,11 @@ SwCntntFrm::SwCntntFrm( SwCntntNode * const pCntnt ) : SwCntntFrm::~SwCntntFrm() { SwCntntNode* pCNd; - if( 0 != ( pCNd = PTR_CAST( SwCntntNode, pRegisteredIn )) && + if( 0 != ( pCNd = PTR_CAST( SwCntntNode, GetRegisteredIn() )) && !pCNd->GetDoc()->IsInDtor() ) { //Bei der Root abmelden wenn ich dort noch im Turbo stehe. - SwRootFrm *pRoot = FindRootFrm(); + SwRootFrm *pRoot = getRootFrm(); if( pRoot && pRoot->GetTurbo() == this ) { pRoot->DisallowTurbo(); @@ -491,13 +489,73 @@ SwCntntFrm::~SwCntntFrm() pTxtFtn = rFtnIdxs[ nPos ]; if( pTxtFtn->GetTxtNode().GetIndex() > nIndex ) break; - pTxtFtn->DelFrms(); + pTxtFtn->DelFrms( this ); ++nPos; } } } } +void SwCntntFrm::RegisterToNode( SwCntntNode& rNode ) +{ + rNode.Add( this ); +} + +void SwCntntFrm::DelFrms( const SwCntntNode& rNode ) +{ + SwIterator<SwCntntFrm,SwCntntNode> aIter( rNode ); + for( SwCntntFrm* pFrm = aIter.First(); pFrm; pFrm = aIter.Next() ) + { + // --> OD 2005-12-01 #i27138# + // notify accessibility paragraphs objects about changed + // CONTENT_FLOWS_FROM/_TO relation. + // Relation CONTENT_FLOWS_FROM for current next paragraph will change + // and relation CONTENT_FLOWS_TO for current previous paragraph will change. + if ( pFrm->IsTxtFrm() ) + { + ViewShell* pViewShell( pFrm->getRootFrm()->GetCurrShell() ); + if ( pViewShell && pViewShell->GetLayout() && + pViewShell->GetLayout()->IsAnyShellAccessible() ) + { + pViewShell->InvalidateAccessibleParaFlowRelation( + dynamic_cast<SwTxtFrm*>(pFrm->FindNextCnt( true )), + dynamic_cast<SwTxtFrm*>(pFrm->FindPrevCnt( true )) ); + } + } + // <-- + if( pFrm->HasFollow() ) + pFrm->GetFollow()->_SetIsFollow( pFrm->IsFollow() ); + if( pFrm->IsFollow() ) + { + SwCntntFrm* pMaster = (SwTxtFrm*)pFrm->FindMaster(); + pMaster->SetFollow( pFrm->GetFollow() ); + pFrm->_SetIsFollow( sal_False ); + } + pFrm->SetFollow( 0 );//Damit er nicht auf dumme Gedanken kommt. + //Andernfalls kann es sein, dass ein Follow + //vor seinem Master zerstoert wird, der Master + //greift dann ueber den ungueltigen + //Follow-Pointer auf fremdes Memory zu. + //Die Kette darf hier zerknauscht werden, weil + //sowieso alle zerstoert werden. + if( pFrm->GetUpper() && pFrm->IsInFtn() && !pFrm->GetIndNext() && + !pFrm->GetIndPrev() ) + { + SwFtnFrm *pFtn = pFrm->FindFtnFrm(); + OSL_ENSURE( pFtn, "You promised a FtnFrm?" ); + SwCntntFrm* pCFrm; + if( !pFtn->GetFollow() && !pFtn->GetMaster() && + 0 != ( pCFrm = pFtn->GetRefFromAttr()) && pCFrm->IsFollow() ) + { + OSL_ENSURE( pCFrm->IsTxtFrm(), "NoTxtFrm has Footnote?" ); + ((SwTxtFrm*)pCFrm->FindMaster())->Prepare( PREP_FTN_GONE ); + } + } + pFrm->Cut(); + delete pFrm; + } +} + /************************************************************************* |* |* SwLayoutFrm::~SwLayoutFrm diff --git a/sw/source/core/layout/tabfrm.cxx b/sw/source/core/layout/tabfrm.cxx index 67af9b31b842..08f756d65b87 100644 --- a/sw/source/core/layout/tabfrm.cxx +++ b/sw/source/core/layout/tabfrm.cxx @@ -41,10 +41,11 @@ #include "frmtool.hxx" #include "frmfmt.hxx" #include "dcontact.hxx" +#include <anchoreddrawobject.hxx> +#include <fmtanchr.hxx> #include "viewopt.hxx" #include "hints.hxx" #include "dbg_lay.hxx" - #include <ftnidx.hxx> #include <svl/itemiter.hxx> #include <docary.hxx> @@ -52,9 +53,7 @@ #include <editeng/ulspitem.hxx> #include <editeng/lrspitem.hxx> #include <editeng/brshitem.hxx> -// --> collapsing borders FME 2005-05-27 #i29550# #include <editeng/boxitem.hxx> -// <-- #include <vcl/outdev.hxx> #include <fmtlsplt.hxx> #include <fmtrowsplt.hxx> @@ -64,7 +63,6 @@ #include <fmtfsize.hxx> #include <swtblfmt.hxx> #include <ndtxt.hxx> - #include "tabfrm.hxx" #include "rowfrm.hxx" #include "cellfrm.hxx" @@ -72,15 +70,11 @@ #include "txtfrm.hxx" //HasFtn() #include "htmltbl.hxx" #include "sectfrm.hxx" //SwSectionFrm -// OD 30.09.2003 #i18732# #include <fmtfollowtextflow.hxx> -// --> OD 2004-06-28 #i28701# #include <sortedobjs.hxx> #include <objectformatter.hxx> -// <-- -// --> OD 2004-10-05 #i26945# #include <layouter.hxx> -// <-- +#include <switerator.hxx> extern void AppendObjs( const SwSpzFrmFmts *pTbl, sal_uLong nIndex, SwFrm *pFrm, SwPageFrm *pPage ); @@ -93,8 +87,8 @@ using namespace ::com::sun::star; |* SwTabFrm::SwTabFrm(), ~SwTabFrm() |* |*************************************************************************/ -SwTabFrm::SwTabFrm( SwTable &rTab ): - SwLayoutFrm( rTab.GetFrmFmt() ), +SwTabFrm::SwTabFrm( SwTable &rTab, SwFrm* pSib ): + SwLayoutFrm( rTab.GetFrmFmt(), pSib ), SwFlowFrm( (SwFrm&)*this ), pTable( &rTab ) { @@ -113,7 +107,7 @@ SwTabFrm::SwTabFrm( SwTable &rTab ): SwFrm *pTmpPrev = 0; for ( sal_uInt16 i = 0; i < rLines.Count(); ++i ) { - SwRowFrm *pNew = new SwRowFrm( *rLines[i] ); + SwRowFrm *pNew = new SwRowFrm( *rLines[i], this ); if( pNew->Lower() ) { pNew->InsertBehind( this, pTmpPrev ); @@ -126,7 +120,7 @@ SwTabFrm::SwTabFrm( SwTable &rTab ): } SwTabFrm::SwTabFrm( SwTabFrm &rTab ) : - SwLayoutFrm( rTab.GetFmt() ), + SwLayoutFrm( rTab.GetFmt(), &rTab ), SwFlowFrm( (SwFrm&)*this ), pTable( rTab.GetTable() ) { @@ -209,8 +203,6 @@ void SwTabFrm::RegistFlys() |* Some prototypes |*************************************************************************/ void MA_FASTCALL SwInvalidateAll( SwFrm *pFrm, long nBottom ); -bool MA_FASTCALL lcl_CalcLowers( SwLayoutFrm *pLay, const SwLayoutFrm* pDontLeave, - long nBottom, bool bSkipRowSpanCells ); void MA_FASTCALL lcl_RecalcRow( SwRowFrm& rRow, long nBottom ); sal_Bool lcl_ArrangeLowers( SwLayoutFrm *pLay, long lYStart, sal_Bool bInva ); // --> OD 2004-10-15 #i26945# - add parameter <_bOnlyRowsAndCells> to control @@ -266,7 +258,7 @@ SwRowFrm* lcl_InsertNewFollowFlowLine( SwTabFrm& rTab, const SwFrm& rTmpRow, boo const SwRowFrm& rRow = (SwRowFrm&)rTmpRow; rTab.SetFollowFlowLine( sal_True ); - SwRowFrm *pFollowFlowLine = new SwRowFrm(*rRow.GetTabLine(), false ); + SwRowFrm *pFollowFlowLine = new SwRowFrm(*rRow.GetTabLine(), &rTab, false ); pFollowFlowLine->SetRowSpanLine( bRowSpanLine ); SwFrm* pFirstRow = rTab.GetFollow()->GetFirstNonHeadlineRow(); pFollowFlowLine->InsertBefore( rTab.GetFollow(), pFirstRow ); @@ -597,7 +589,7 @@ void lcl_PreprocessRowsInCells( SwTabFrm& rTab, SwRowFrm& rLastLine, !bTableLayoutToComplex && nMinHeight < nTmpCut ) ) { // The line has to be split: - SwRowFrm* pNewRow = new SwRowFrm( *pTmpLastLineRow->GetTabLine(), false ); + SwRowFrm* pNewRow = new SwRowFrm( *pTmpLastLineRow->GetTabLine(), &rTab, false ); pNewRow->SetFollowFlowRow( true ); pNewRow->SetFollowRow( pTmpLastLineRow->GetFollowRow() ); pTmpLastLineRow->SetFollowRow( pNewRow ); @@ -1237,7 +1229,7 @@ bool SwTabFrm::Split( const SwTwips nCutPos, bool bTryToSplit, bool bTableRowKee // Insert new headlines: bDontCreateObjects = sal_True; //frmtool SwRowFrm* pHeadline = new SwRowFrm( - *GetTable()->GetTabLines()[ nRowCount ] ); + *GetTable()->GetTabLines()[ nRowCount ], this ); pHeadline->SetRepeatedHeadline( true ); bDontCreateObjects = sal_False; pHeadline->InsertBefore( pFoll, 0 ); @@ -1498,7 +1490,7 @@ void lcl_InvalidateAllLowersPrt( SwLayoutFrm* pLayFrm ) } // <-- collapsing -bool MA_FASTCALL lcl_CalcLowers( SwLayoutFrm* pLay, const SwLayoutFrm* pDontLeave, +bool SwCntntFrm::CalcLowers( SwLayoutFrm* pLay, const SwLayoutFrm* pDontLeave, long nBottom, bool bSkipRowSpanCells ) { if ( !pLay ) @@ -1551,7 +1543,7 @@ bool MA_FASTCALL lcl_CalcLowers( SwLayoutFrm* pLay, const SwLayoutFrm* pDontLeav OSL_ENSURE( !pCnt->IsTxtFrm() || pCnt->IsValid() || static_cast<SwTxtFrm*>(pCnt)->IsJoinLocked(), - "<lcl_CalcLowers(..)> - text frame invalid and not locked." ); + "<SwCntntFrm::CalcLowers(..)> - text frame invalid and not locked." ); if ( pCnt->IsTxtFrm() && pCnt->IsValid() ) { // --> OD 2004-11-02 #i23129#, #i36347# - pass correct page frame to @@ -1576,7 +1568,7 @@ bool MA_FASTCALL lcl_CalcLowers( SwLayoutFrm* pLay, const SwLayoutFrm* pDontLeav } #if OSL_DEBUG_LEVEL > 1 - OSL_FAIL( "LoopControl in lcl_CalcLowers" ); + OSL_FAIL( "LoopControl in SwCntntFrm::CalcLowers" ) #endif } } @@ -1683,7 +1675,7 @@ void MA_FASTCALL lcl_RecalcRow( SwRowFrm& rRow, long nBottom ) { // --> OD 2004-11-23 #115759# - force another format of the // lowers, if at least one of it was invalid. - bCheck = lcl_CalcLowers( &rRow, rRow.GetUpper(), nBottom, true ); + bCheck = SwCntntFrm::CalcLowers( &rRow, rRow.GetUpper(), nBottom, true ); // <-- // NEW TABLES @@ -1703,7 +1695,7 @@ void MA_FASTCALL lcl_RecalcRow( SwRowFrm& rRow, long nBottom ) SwCellFrm& rToRecalc = 0 == i ? const_cast<SwCellFrm&>(pCellFrm->FindStartEndOfRowSpanCell( true, true )) : *pCellFrm; - bCheck |= lcl_CalcLowers( &rToRecalc, &rToRecalc, nBottom, false ); + bCheck |= SwCntntFrm::CalcLowers( &rToRecalc, &rToRecalc, nBottom, false ); } pCellFrm = static_cast<SwCellFrm*>(pCellFrm->GetNext()); @@ -2163,7 +2155,8 @@ void SwTabFrm::MakeAll() /// OD 23.10.2002 #103517# - In online layout try to grow upper of table /// frame, if table frame doesn't fit in its upper. - const bool bBrowseMode = GetFmt()->getIDocumentSettingAccess()->get(IDocumentSettingAccess::BROWSE_MODE); + const ViewShell *pSh = getRootFrm()->GetCurrShell(); + const bool bBrowseMode = pSh && pSh->GetViewOptions()->getBrowseMode(); if ( nDistanceToUpperPrtBottom < 0 && bBrowseMode ) { if ( GetUpper()->Grow( -nDistanceToUpperPrtBottom ) ) @@ -3061,11 +3054,11 @@ void SwTabFrm::Format( const SwBorderAttrs *pAttrs ) else (this->*fnRect->fnSetXMargins)( nLeftSpacing, nRightSpacing ); - ViewShell *pSh; + ViewShell *pSh = getRootFrm()->GetCurrShell(); if ( bCheckBrowseWidth && - GetFmt()->getIDocumentSettingAccess()->get(IDocumentSettingAccess::BROWSE_MODE) && + pSh && pSh->GetViewOptions()->getBrowseMode() && GetUpper()->IsPageBodyFrm() && // nur PageBodyFrms, nicht etwa ColBodyFrms - 0 != (pSh = GetShell()) && pSh->VisArea().Width() ) + pSh->VisArea().Width() ) { //Nicht ueber die Kante des sichbaren Bereiches hinausragen. //Die Seite kann breiter sein, weil es Objekte mit "ueberbreite" @@ -3146,7 +3139,7 @@ SwTwips SwTabFrm::GrowFrm( SwTwips nDist, sal_Bool bTst, sal_Bool bInfo ) { (Frm().*fnRect->fnAddBottom)( nDist ); - SwRootFrm *pRootFrm = FindRootFrm(); + SwRootFrm *pRootFrm = getRootFrm(); if( pRootFrm && pRootFrm->IsAnyShellAccessible() && pRootFrm->GetCurrShell() ) { @@ -3190,7 +3183,7 @@ SwTwips SwTabFrm::GrowFrm( SwTwips nDist, sal_Bool bTst, sal_Bool bInfo ) |* SwTabFrm::Modify() |* |*************************************************************************/ -void SwTabFrm::Modify( SfxPoolItem * pOld, SfxPoolItem * pNew ) +void SwTabFrm::Modify( const SfxPoolItem* pOld, const SfxPoolItem * pNew ) { sal_uInt8 nInvFlags = 0; sal_Bool bAttrSetChg = pNew && RES_ATTRSET_CHG == pNew->Which(); @@ -3253,7 +3246,7 @@ void SwTabFrm::Modify( SfxPoolItem * pOld, SfxPoolItem * pNew ) } } -void SwTabFrm::_UpdateAttr( SfxPoolItem *pOld, SfxPoolItem *pNew, +void SwTabFrm::_UpdateAttr( const SfxPoolItem *pOld, const SfxPoolItem *pNew, sal_uInt8 &rInvFlags, SwAttrSetChg *pOldSet, SwAttrSetChg *pNewSet ) { @@ -3277,7 +3270,7 @@ void SwTabFrm::_UpdateAttr( SfxPoolItem *pOld, SfxPoolItem *pNew, for ( sal_uInt16 nIdx = 0; nIdx < nNewRepeat; ++nIdx ) { bDontCreateObjects = sal_True; //frmtool - SwRowFrm* pHeadline = new SwRowFrm( *GetTable()->GetTabLines()[ nIdx ] ); + SwRowFrm* pHeadline = new SwRowFrm( *GetTable()->GetTabLines()[ nIdx ], this ); pHeadline->SetRepeatedHeadline( true ); bDontCreateObjects = sal_False; pHeadline->Paste( this, pLowerRow ); @@ -3538,7 +3531,8 @@ sal_Bool SwTabFrm::ShouldBwdMoved( SwLayoutFrm *pNewUpper, sal_Bool, sal_Bool &r nSpace = nTmpSpace; // <-- - if ( GetFmt()->getIDocumentSettingAccess()->get(IDocumentSettingAccess::BROWSE_MODE) ) + const ViewShell *pSh = getRootFrm()->GetCurrShell(); + if( pSh && pSh->GetViewOptions()->getBrowseMode() ) nSpace += pNewUpper->Grow( LONG_MAX, sal_True ); } } @@ -3754,8 +3748,8 @@ void SwTabFrm::Prepare( const PrepareHint eHint, const void *, sal_Bool ) |* SwRowFrm::SwRowFrm(), ~SwRowFrm() |* |*************************************************************************/ -SwRowFrm::SwRowFrm( const SwTableLine &rLine, bool bInsertContent ): - SwLayoutFrm( rLine.GetFrmFmt() ), +SwRowFrm::SwRowFrm( const SwTableLine &rLine, SwFrm* pSib, bool bInsertContent ): + SwLayoutFrm( rLine.GetFrmFmt(), pSib ), pTabLine( &rLine ), pFollowRow( 0 ), // --> collapsing borders FME 2005-05-27 #i29550# @@ -3776,7 +3770,7 @@ SwRowFrm::SwRowFrm( const SwTableLine &rLine, bool bInsertContent ): SwFrm *pTmpPrev = 0; for ( sal_uInt16 i = 0; i < rBoxes.Count(); ++i ) { - SwCellFrm *pNew = new SwCellFrm( *rBoxes[i], bInsertContent ); + SwCellFrm *pNew = new SwCellFrm( *rBoxes[i], this, bInsertContent ); pNew->InsertBehind( this, pTmpPrev ); pTmpPrev = pNew; } @@ -3808,7 +3802,7 @@ void SwRowFrm::RegistFlys( SwPageFrm *pPage ) |* SwRowFrm::Modify() |* |*************************************************************************/ -void SwRowFrm::Modify( SfxPoolItem * pOld, SfxPoolItem * pNew ) +void SwRowFrm::Modify( const SfxPoolItem* pOld, const SfxPoolItem * pNew ) { sal_Bool bAttrSetChg = pNew && RES_ATTRSET_CHG == pNew->Which(); const SfxPoolItem *pItem = 0; @@ -4282,13 +4276,9 @@ void SwRowFrm::Format( const SwBorderAttrs *pAttrs ) // If we found a 'previous' row, we look for the appropriate row frame: if ( pPrevTabLine ) { - SwClientIter aIter( *pPrevTabLine->GetFrmFmt() ); - SwClient* pLast; - for ( pLast = aIter.First( TYPE( SwFrm ) ); pLast; pLast = aIter.Next() ) + SwIterator<SwRowFrm,SwFmt> aIter( *pPrevTabLine->GetFrmFmt() ); + for ( SwRowFrm* pRow = aIter.First(); pRow; pRow = aIter.Next() ) { - OSL_ENSURE( ((SwFrm*)pLast)->IsRowFrm(), - "Non-row frame registered in table line" ); - SwRowFrm* pRow = (SwRowFrm*)pLast; // --> OD 2004-11-23 #115759# - do *not* take repeated // headlines, because during split of table it can be // invalid and thus can't provide correct border values. @@ -4397,7 +4387,7 @@ void SwRowFrm::AdjustCells( const SwTwips nHeight, const sal_Bool bHeight ) SwFrm *pFrm = Lower(); if ( bHeight ) { - SwRootFrm *pRootFrm = FindRootFrm(); + SwRootFrm *pRootFrm = getRootFrm(); SWRECTFN( this ) SwRect aOldFrm; @@ -4504,7 +4494,7 @@ void SwRowFrm::Cut() // --> OD 2010-02-17 #i103961# // notification for accessibility { - SwRootFrm *pRootFrm = FindRootFrm(); + SwRootFrm *pRootFrm = getRootFrm(); if( pRootFrm && pRootFrm->IsAnyShellAccessible() ) { ViewShell* pVSh = pRootFrm->GetCurrShell(); @@ -4747,8 +4737,8 @@ bool SwRowFrm::ShouldRowKeepWithNext() const |* SwCellFrm::SwCellFrm(), ~SwCellFrm() |* |*************************************************************************/ -SwCellFrm::SwCellFrm( const SwTableBox &rBox, bool bInsertContent ) : - SwLayoutFrm( rBox.GetFrmFmt() ), +SwCellFrm::SwCellFrm( const SwTableBox &rBox, SwFrm* pSib, bool bInsertContent ) : + SwLayoutFrm( rBox.GetFrmFmt(), pSib ), pTabBox( &rBox ) { nType = FRMC_CELL; @@ -4770,7 +4760,7 @@ SwCellFrm::SwCellFrm( const SwTableBox &rBox, bool bInsertContent ) : SwFrm *pTmpPrev = 0; for ( sal_uInt16 i = 0; i < rLines.Count(); ++i ) { - SwRowFrm *pNew = new SwRowFrm( *rLines[i], bInsertContent ); + SwRowFrm *pNew = new SwRowFrm( *rLines[i], this, bInsertContent ); pNew->InsertBehind( this, pTmpPrev ); pTmpPrev = pNew; } @@ -4784,7 +4774,7 @@ SwCellFrm::~SwCellFrm() { // At this stage the lower frames aren't destroyed already, // therfor we have to do a recursive dispose. - SwRootFrm *pRootFrm = FindRootFrm(); + SwRootFrm *pRootFrm = getRootFrm(); if( pRootFrm && pRootFrm->IsAnyShellAccessible() && pRootFrm->GetCurrShell() ) { @@ -5302,7 +5292,7 @@ void SwCellFrm::Format( const SwBorderAttrs *pAttrs ) |* |*************************************************************************/ -void SwCellFrm::Modify( SfxPoolItem * pOld, SfxPoolItem * pNew ) +void SwCellFrm::Modify( const SfxPoolItem* pOld, const SfxPoolItem * pNew ) { sal_Bool bAttrSetChg = pNew && RES_ATTRSET_CHG == pNew->Which(); const SfxPoolItem *pItem = 0; @@ -5334,7 +5324,7 @@ void SwCellFrm::Modify( SfxPoolItem * pOld, SfxPoolItem * pNew ) SFX_ITEM_SET == ((SwAttrSetChg*)pNew)->GetChgSet()->GetItemState( RES_PROTECT, sal_False ) ) || RES_PROTECT == pNew->Which() ) { - ViewShell *pSh = GetShell(); + ViewShell *pSh = getRootFrm()->GetCurrShell(); if( pSh && pSh->GetLayout()->IsAnyShellAccessible() ) pSh->Imp()->InvalidateAccessibleEditableState( sal_True, this ); } @@ -5394,7 +5384,7 @@ void SwCellFrm::Cut() { // notification for accessibility { - SwRootFrm *pRootFrm = FindRootFrm(); + SwRootFrm *pRootFrm = getRootFrm(); if( pRootFrm && pRootFrm->IsAnyShellAccessible() ) { ViewShell* pVSh = pRootFrm->GetCurrShell(); diff --git a/sw/source/core/layout/trvlfrm.cxx b/sw/source/core/layout/trvlfrm.cxx index b83bab70c8c4..17b9a29ee78b 100644 --- a/sw/source/core/layout/trvlfrm.cxx +++ b/sw/source/core/layout/trvlfrm.cxx @@ -879,7 +879,7 @@ sal_uInt16 SwRootFrm::GetCurrPage( const SwPaM *pActualCrsr ) const { OSL_ENSURE( pActualCrsr, "Welche Seite soll's denn sein?" ); SwFrm const*const pActFrm = pActualCrsr->GetPoint()->nNode.GetNode(). - GetCntntNode()->GetFrm( 0, + GetCntntNode()->getLayoutFrm( this, 0, pActualCrsr->GetPoint(), sal_False ); return pActFrm->FindPageFrm()->GetPhyPageNum(); @@ -1841,8 +1841,8 @@ bool SwRootFrm::MakeTblCrsrs( SwTableCursor& rTblCrsr ) const SwCntntNode* pTmpStartNode = rTblCrsr.GetCntntNode(); const SwCntntNode* pTmpEndNode = rTblCrsr.GetCntntNode(sal_False); - const SwFrm* pTmpStartFrm = pTmpStartNode ? pTmpStartNode->GetFrm( &aPtPt, 0, sal_False ) : 0; - const SwFrm* pTmpEndFrm = pTmpEndNode ? pTmpEndNode->GetFrm( &aMkPt, 0, sal_False ) : 0; + const SwFrm* pTmpStartFrm = pTmpStartNode ? pTmpStartNode->getLayoutFrm( this, &aPtPt, 0, sal_False ) : 0; + const SwFrm* pTmpEndFrm = pTmpEndNode ? pTmpEndNode->getLayoutFrm( this, &aMkPt, 0, sal_False ) : 0; const SwLayoutFrm* pStart = pTmpStartFrm ? pTmpStartFrm->GetUpper() : 0; const SwLayoutFrm* pEnd = pTmpEndFrm ? pTmpEndFrm->GetUpper() : 0; @@ -1975,7 +1975,7 @@ void SwRootFrm::CalcFrmRects( SwShellCrsr &rCrsr, sal_Bool bIsTblMode ) *pEndPos = rCrsr.GetPoint() == pStartPos ? rCrsr.GetMark() : rCrsr.GetPoint(); - ViewShell *pSh = GetShell(); + ViewShell *pSh = GetCurrShell(); // --> FME 2004-06-08 #i12836# enhanced pdf SwRegionRects aRegion( pSh && !pSh->GetViewOptions()->IsPDFExport() ? @@ -1983,10 +1983,10 @@ void SwRootFrm::CalcFrmRects( SwShellCrsr &rCrsr, sal_Bool bIsTblMode ) Frm() ); // <-- if( !pStartPos->nNode.GetNode().IsCntntNode() || - !pStartPos->nNode.GetNode().GetCntntNode()->GetFrm() || + !pStartPos->nNode.GetNode().GetCntntNode()->getLayoutFrm(this) || ( pStartPos->nNode != pEndPos->nNode && ( !pEndPos->nNode.GetNode().IsCntntNode() || - !pEndPos->nNode.GetNode().GetCntntNode()->GetFrm() ) ) ) + !pEndPos->nNode.GetNode().GetCntntNode()->getLayoutFrm(this) ) ) ) { return; } @@ -1994,10 +1994,10 @@ void SwRootFrm::CalcFrmRects( SwShellCrsr &rCrsr, sal_Bool bIsTblMode ) //Erstmal die CntntFrms zum Start und End besorgen, die brauch ich auf //jedenfall. SwCntntFrm const* pStartFrm = pStartPos->nNode.GetNode(). - GetCntntNode()->GetFrm( &rCrsr.GetSttPos(), pStartPos ); + GetCntntNode()->getLayoutFrm( this, &rCrsr.GetSttPos(), pStartPos ); SwCntntFrm const* pEndFrm = pEndPos->nNode.GetNode(). - GetCntntNode()->GetFrm( &rCrsr.GetEndPos(), pEndPos ); + GetCntntNode()->getLayoutFrm( this, &rCrsr.GetEndPos(), pEndPos ); OSL_ENSURE( (pStartFrm && pEndFrm), "Keine CntntFrms gefunden." ); diff --git a/sw/source/core/layout/wsfrm.cxx b/sw/source/core/layout/wsfrm.cxx index a0e19939dd61..703c7d4cfc46 100644 --- a/sw/source/core/layout/wsfrm.cxx +++ b/sw/source/core/layout/wsfrm.cxx @@ -43,8 +43,11 @@ #include <rootfrm.hxx> #include <cntfrm.hxx> #include <dcontact.hxx> +#include <anchoreddrawobject.hxx> +#include <fmtanchr.hxx> #include <viewsh.hxx> #include <viewimp.hxx> +#include "viewopt.hxx" #include <doc.hxx> #include <fesh.hxx> #include <docsh.hxx> @@ -84,11 +87,12 @@ using namespace ::com::sun::star; |* |*************************************************************************/ -SwFrm::SwFrm( SwModify *pMod ) : +SwFrm::SwFrm( SwModify *pMod, SwFrm* pSib ) : SwClient( pMod ), // --> OD 2006-05-10 #i65250# mnFrmId( SwFrm::mnLastFrmId++ ), // <-- + mpRoot( pSib ? pSib->getRootFrm() : 0 ), pUpper( 0 ), pNext( 0 ), pPrev( 0 ), @@ -113,15 +117,15 @@ SwFrm::SwFrm( SwModify *pMod ) : bCompletePaint = bInfInvalid = sal_True; } - -ViewShell * SwFrm::GetShell() const +bool SwFrm::KnowsFormat( const SwFmt& rFmt ) const { - const SwRootFrm *pRoot; - if ( 0 != (pRoot = FindRootFrm()) ) - return pRoot->GetCurrShell(); - return 0; + return GetRegisteredIn() == &rFmt; } +void SwFrm::RegisterToFormat( SwFmt& rFmt ) +{ + rFmt.Add( this ); +} void SwFrm::CheckDir( sal_uInt16 nDir, sal_Bool bVert, sal_Bool bOnlyBiDi, sal_Bool bBrowse ) { @@ -182,9 +186,12 @@ void SwSectionFrm::CheckDirection( sal_Bool bVert ) { const SwFrmFmt* pFmt = GetFmt(); if( pFmt ) + { + const ViewShell *pSh = getRootFrm()->GetCurrShell(); + const sal_Bool bBrowseMode = pSh && pSh->GetViewOptions()->getBrowseMode(); CheckDir(((SvxFrameDirectionItem&)pFmt->GetFmtAttr(RES_FRAMEDIR)).GetValue(), - bVert, sal_True, - pFmt->getIDocumentSettingAccess()->get(IDocumentSettingAccess::BROWSE_MODE) ); + bVert, sal_True, bBrowseMode ); + } else SwFrm::CheckDirection( bVert ); } @@ -193,9 +200,12 @@ void SwFlyFrm::CheckDirection( sal_Bool bVert ) { const SwFrmFmt* pFmt = GetFmt(); if( pFmt ) + { + const ViewShell *pSh = getRootFrm()->GetCurrShell(); + const sal_Bool bBrowseMode = pSh && pSh->GetViewOptions()->getBrowseMode(); CheckDir(((SvxFrameDirectionItem&)pFmt->GetFmtAttr(RES_FRAMEDIR)).GetValue(), - bVert, sal_False, - pFmt->getIDocumentSettingAccess()->get(IDocumentSettingAccess::BROWSE_MODE) ); + bVert, sal_False, bBrowseMode ); + } else SwFrm::CheckDirection( bVert ); } @@ -204,9 +214,12 @@ void SwTabFrm::CheckDirection( sal_Bool bVert ) { const SwFrmFmt* pFmt = GetFmt(); if( pFmt ) + { + const ViewShell *pSh = getRootFrm()->GetCurrShell(); + const sal_Bool bBrowseMode = pSh && pSh->GetViewOptions()->getBrowseMode(); CheckDir(((SvxFrameDirectionItem&)pFmt->GetFmtAttr(RES_FRAMEDIR)).GetValue(), - bVert, sal_True, - pFmt->getIDocumentSettingAccess()->get(IDocumentSettingAccess::BROWSE_MODE) ); + bVert, sal_True, bBrowseMode ); + } else SwFrm::CheckDirection( bVert ); } @@ -222,8 +235,9 @@ void SwCellFrm::CheckDirection( sal_Bool bVert ) if( pFmt && SFX_ITEM_SET == pFmt->GetItemState( RES_FRAMEDIR, sal_True, &pItem ) ) { const SvxFrameDirectionItem* pFrmDirItem = static_cast<const SvxFrameDirectionItem*>(pItem); - CheckDir( pFrmDirItem->GetValue(), bVert, sal_False, - pFmt->getIDocumentSettingAccess()->get(IDocumentSettingAccess::BROWSE_MODE) ); + const ViewShell *pSh = getRootFrm()->GetCurrShell(); + const sal_Bool bBrowseMode = pSh && pSh->GetViewOptions()->getBrowseMode(); + CheckDir( pFrmDirItem->GetValue(), bVert, sal_False, bBrowseMode ); } else SwFrm::CheckDirection( bVert ); @@ -231,17 +245,14 @@ void SwCellFrm::CheckDirection( sal_Bool bVert ) void SwTxtFrm::CheckDirection( sal_Bool bVert ) { + const ViewShell *pSh = getRootFrm()->GetCurrShell(); + const sal_Bool bBrowseMode = pSh && pSh->GetViewOptions()->getBrowseMode(); CheckDir( GetTxtNode()->GetSwAttrSet().GetFrmDir().GetValue(), bVert, - sal_True, - GetTxtNode()->getIDocumentSettingAccess()->get(IDocumentSettingAccess::BROWSE_MODE) ); + sal_True, bBrowseMode ); } -/************************************************************************* -|* -|* SwFrm::Modify() -|* -|*************************************************************************/ -void SwFrm::Modify( SfxPoolItem * pOld, SfxPoolItem * pNew ) +/*************************************************************************/ +void SwFrm::Modify( const SfxPoolItem* pOld, const SfxPoolItem * pNew ) { sal_uInt8 nInvFlags = 0; @@ -290,7 +301,7 @@ void SwFrm::Modify( SfxPoolItem * pOld, SfxPoolItem * pNew ) } } -void SwFrm::_UpdateAttrFrm( SfxPoolItem *pOld, SfxPoolItem *pNew, +void SwFrm::_UpdateAttrFrm( const SfxPoolItem *pOld, const SfxPoolItem *pNew, sal_uInt8 &rInvFlags ) { sal_uInt16 nWhich = pOld ? pOld->Which() : pNew ? pNew->Which() : 0; @@ -970,7 +981,7 @@ void SwCntntFrm::Cut() //er die Retouche uebernehmen. //Ausserdem kann eine Leerseite entstanden sein. else - { SwRootFrm *pRoot = FindRootFrm(); + { SwRootFrm *pRoot = getRootFrm(); if ( pRoot ) { pRoot->SetSuperfluous(); @@ -1365,7 +1376,8 @@ SwTwips SwFrm::AdjustNeighbourhood( SwTwips nDiff, sal_Bool bTst ) if ( !nDiff || !GetUpper()->IsFtnBossFrm() ) // nur innerhalb von Seiten/Spalten return 0L; - sal_Bool bBrowse = GetUpper()->GetFmt()->getIDocumentSettingAccess()->get(IDocumentSettingAccess::BROWSE_MODE); + const ViewShell *pSh = getRootFrm()->GetCurrShell(); + const sal_Bool bBrowse = pSh && pSh->GetViewOptions()->getBrowseMode(); //Der (Page)Body veraendert sich nur im BrowseMode, aber nicht wenn er //Spalten enthaelt. @@ -1379,16 +1391,16 @@ SwTwips SwFrm::AdjustNeighbourhood( SwTwips nDiff, sal_Bool bTst ) long nBrowseAdd = 0; if ( bBrowse && GetUpper()->IsPageFrm() ) // nur (Page)BodyFrms { - ViewShell *pSh = GetShell(); + ViewShell *pViewShell = getRootFrm()->GetCurrShell(); SwLayoutFrm *pUp = GetUpper(); long nChg; const long nUpPrtBottom = pUp->Frm().Height() - pUp->Prt().Height() - pUp->Prt().Top(); SwRect aInva( pUp->Frm() ); - if ( pSh ) + if ( pViewShell ) { - aInva.Pos().X() = pSh->VisArea().Left(); - aInva.Width( pSh->VisArea().Width() ); + aInva.Pos().X() = pViewShell->VisArea().Left(); + aInva.Width( pViewShell->VisArea().Width() ); } if ( nDiff > 0 ) { @@ -1398,7 +1410,7 @@ SwTwips SwFrm::AdjustNeighbourhood( SwTwips nDiff, sal_Bool bTst ) if ( !IsBodyFrm() ) { SetCompletePaint(); - if ( !pSh || pSh->VisArea().Height() >= pUp->Frm().Height() ) + if ( !pViewShell || pViewShell->VisArea().Height() >= pUp->Frm().Height() ) { //Ersteinmal den Body verkleinern. Der waechst dann schon //wieder. @@ -1428,12 +1440,12 @@ SwTwips SwFrm::AdjustNeighbourhood( SwTwips nDiff, sal_Bool bTst ) //mindestens so gross wie die VisArea. nChg = nDiff; long nInvaAdd = 0; - if ( pSh && !pUp->GetPrev() && - pUp->Frm().Height() + nDiff < pSh->VisArea().Height() ) + if ( pViewShell && !pUp->GetPrev() && + pUp->Frm().Height() + nDiff < pViewShell->VisArea().Height() ) { //Das heisst aber wiederum trotzdem, das wir geeignet invalidieren //muessen. - nChg = pSh->VisArea().Height() - pUp->Frm().Height(); + nChg = pViewShell->VisArea().Height() - pUp->Frm().Height(); nInvaAdd = -(nDiff - nChg); } @@ -1456,16 +1468,16 @@ SwTwips SwFrm::AdjustNeighbourhood( SwTwips nDiff, sal_Bool bTst ) if ( !bTst ) { //Unabhaengig von nChg - if ( pSh && aInva.HasArea() && pUp->GetUpper() ) - pSh->InvalidateWindows( aInva ); + if ( pViewShell && aInva.HasArea() && pUp->GetUpper() ) + pViewShell->InvalidateWindows( aInva ); } if ( !bTst && nChg ) { const SwRect aOldRect( pUp->Frm() ); pUp->Frm().SSize().Height() += nChg; pUp->Prt().SSize().Height() += nChg; - if ( pSh ) - pSh->Imp()->SetFirstVisPageInvalid(); + if ( pViewShell ) + pViewShell->Imp()->SetFirstVisPageInvalid(); if ( GetNext() ) GetNext()->_InvalidatePos(); @@ -1473,7 +1485,7 @@ SwTwips SwFrm::AdjustNeighbourhood( SwTwips nDiff, sal_Bool bTst ) //Ggf. noch ein Repaint ausloesen. const SvxGraphicPosition ePos = pUp->GetFmt()->GetBackground().GetGraphicPos(); if ( ePos != GPOS_NONE && ePos != GPOS_TILED ) - pSh->InvalidateWindows( pUp->Frm() ); + pViewShell->InvalidateWindows( pUp->Frm() ); if ( pUp->GetUpper() ) { @@ -1855,7 +1867,8 @@ SwTwips SwCntntFrm::GrowFrm( SwTwips nDist, sal_Bool bTst, sal_Bool bInfo ) nDist > (LONG_MAX - nFrmHeight ) ) nDist = LONG_MAX - nFrmHeight; - const sal_Bool bBrowse = GetUpper()->GetFmt()->getIDocumentSettingAccess()->get(IDocumentSettingAccess::BROWSE_MODE); + const ViewShell *pSh = getRootFrm()->GetCurrShell(); + const sal_Bool bBrowse = pSh && pSh->GetViewOptions()->getBrowseMode(); const sal_uInt16 nTmpType = bBrowse ? 0x2084: 0x2004; //Row+Cell, Browse mit Body if( !(GetUpper()->GetType() & nTmpType) && GetUpper()->HasFixSize() ) { @@ -2077,7 +2090,7 @@ SwTwips SwCntntFrm::ShrinkFrm( SwTwips nDist, sal_Bool bTst, sal_Bool bInfo ) |* SwCntntFrm::Modify() |* |*************************************************************************/ -void SwCntntFrm::Modify( SfxPoolItem * pOld, SfxPoolItem * pNew ) +void SwCntntFrm::Modify( const SfxPoolItem* pOld, const SfxPoolItem * pNew ) { sal_uInt8 nInvFlags = 0; @@ -2150,7 +2163,7 @@ void SwCntntFrm::Modify( SfxPoolItem * pOld, SfxPoolItem * pNew ) } } -void SwCntntFrm::_UpdateAttr( SfxPoolItem* pOld, SfxPoolItem* pNew, +void SwCntntFrm::_UpdateAttr( const SfxPoolItem* pOld, const SfxPoolItem* pNew, sal_uInt8 &rInvFlags, SwAttrSetChg *pOldSet, SwAttrSetChg *pNewSet ) { @@ -2306,8 +2319,8 @@ void SwCntntFrm::_UpdateAttr( SfxPoolItem* pOld, SfxPoolItem* pNew, |* SwLayoutFrm::SwLayoutFrm() |* |*************************************************************************/ -SwLayoutFrm::SwLayoutFrm( SwFrmFmt* pFmt ): - SwFrm( pFmt ), +SwLayoutFrm::SwLayoutFrm( SwFrmFmt* pFmt, SwFrm* pSib ): + SwFrm( pFmt, pSib ), pLower( 0 ) { const SwFmtFrmSize &rFmtSize = pFmt->GetFrmSize(); @@ -2367,7 +2380,8 @@ SwTwips SwLayoutFrm::InnerHeight() const |*************************************************************************/ SwTwips SwLayoutFrm::GrowFrm( SwTwips nDist, sal_Bool bTst, sal_Bool bInfo ) { - const sal_Bool bBrowse = GetFmt()->getIDocumentSettingAccess()->get(IDocumentSettingAccess::BROWSE_MODE); + const ViewShell *pSh = getRootFrm()->GetCurrShell(); + const sal_Bool bBrowse = pSh && pSh->GetViewOptions()->getBrowseMode(); const sal_uInt16 nTmpType = bBrowse ? 0x2084: 0x2004; //Row+Cell, Browse mit Body if( !(GetType() & nTmpType) && HasFixSize() ) return 0; @@ -2515,7 +2529,7 @@ SwTwips SwLayoutFrm::GrowFrm( SwTwips nDist, sal_Bool bTst, sal_Bool bInfo ) if( bMoveAccFrm && IsAccessibleFrm() ) { - SwRootFrm *pRootFrm = FindRootFrm(); + SwRootFrm *pRootFrm = getRootFrm(); if( pRootFrm && pRootFrm->IsAnyShellAccessible() && pRootFrm->GetCurrShell() ) { @@ -2532,7 +2546,8 @@ SwTwips SwLayoutFrm::GrowFrm( SwTwips nDist, sal_Bool bTst, sal_Bool bInfo ) |*************************************************************************/ SwTwips SwLayoutFrm::ShrinkFrm( SwTwips nDist, sal_Bool bTst, sal_Bool bInfo ) { - const sal_Bool bBrowse = GetFmt()->getIDocumentSettingAccess()->get(IDocumentSettingAccess::BROWSE_MODE); + const ViewShell *pSh = getRootFrm()->GetCurrShell(); + const sal_Bool bBrowse = pSh && pSh->GetViewOptions()->getBrowseMode(); const sal_uInt16 nTmpType = bBrowse ? 0x2084: 0x2004; //Row+Cell, Browse mit Body if( !(GetType() & nTmpType) && HasFixSize() ) return 0; @@ -2633,7 +2648,7 @@ SwTwips SwLayoutFrm::ShrinkFrm( SwTwips nDist, sal_Bool bTst, sal_Bool bInfo ) if( bMoveAccFrm && IsAccessibleFrm() ) { - SwRootFrm *pRootFrm = FindRootFrm(); + SwRootFrm *pRootFrm = getRootFrm(); if( pRootFrm && pRootFrm->IsAnyShellAccessible() && pRootFrm->GetCurrShell() ) { @@ -3279,10 +3294,9 @@ long SwLayoutFrm::CalcRel( const SwFmtFrmSize &rSz, sal_Bool ) const { const SwFrm *pRel = GetUpper(); long nRel = LONG_MAX; - const ViewShell *pSh = GetShell(); - if ( pRel->IsPageBodyFrm() && - GetFmt()->getIDocumentSettingAccess()->get(IDocumentSettingAccess::BROWSE_MODE) && - pSh && pSh->VisArea().Width()) + const ViewShell *pSh = getRootFrm()->GetCurrShell(); + const sal_Bool bBrowseMode = pSh && pSh->GetViewOptions()->getBrowseMode(); + if( pRel->IsPageBodyFrm() && pSh && bBrowseMode && pSh->VisArea().Width() ) { nRel = pSh->GetBrowseWidth(); long nDiff = nRel - pRel->Prt().Width(); @@ -3383,7 +3397,8 @@ void SwLayoutFrm::FormatWidthCols( const SwBorderAttrs &rAttrs, sal_Bool bEnd = sal_False; sal_Bool bBackLock = sal_False; - SwViewImp *pImp = GetShell() ? GetShell()->Imp() : 0; + ViewShell *pSh = getRootFrm()->GetCurrShell(); + SwViewImp *pImp = pSh ? pSh->Imp() : 0; { // Zugrunde liegender Algorithmus // Es wird versucht, eine optimale Hoehe fuer die Spalten zu finden. @@ -3895,7 +3910,7 @@ void SwRootFrm::InvalidateAllCntnt( sal_uInt8 nInv ) if( nInv & INV_PRTAREA ) { - ViewShell *pSh = GetShell(); + ViewShell *pSh = getRootFrm()->GetCurrShell(); if( pSh ) pSh->InvalidateWindows( Frm() ); } diff --git a/sw/source/core/objectpositioning/tocntntanchoredobjectposition.cxx b/sw/source/core/objectpositioning/tocntntanchoredobjectposition.cxx index b4102c073e70..e4a199695fd8 100644 --- a/sw/source/core/objectpositioning/tocntntanchoredobjectposition.cxx +++ b/sw/source/core/objectpositioning/tocntntanchoredobjectposition.cxx @@ -36,6 +36,9 @@ #include <sectfrm.hxx> // #i26945# #include <tabfrm.hxx> +#include "rootfrm.hxx" +#include "viewopt.hxx" +#include "viewsh.hxx" #include <frmfmt.hxx> #include <IDocumentSettingAccess.hxx> #include <fmtsrnd.hxx> @@ -157,10 +160,13 @@ void SwToCntntAnchoredObjectPosition::CalcPosition() // declare and set <bBrowse> to true, if document is in browser mode and // object is anchored at the body, but not at frame belonging to a table. - const bool bBrowse = GetAnchorFrm().IsInDocBody() && - !GetAnchorFrm().IsInTab() - ? rFrmFmt.getIDocumentSettingAccess()->get(IDocumentSettingAccess::BROWSE_MODE) - : false; + bool bBrowse = GetAnchorFrm().IsInDocBody() && !GetAnchorFrm().IsInTab(); + if( bBrowse ) + { + const ViewShell *pSh = GetAnchorFrm().getRootFrm()->GetCurrShell(); + if( !pSh || !pSh->GetViewOptions()->getBrowseMode() ) + bBrowse = false; + } // determine left/right and its upper/lower spacing. const SvxLRSpaceItem &rLR = rFrmFmt.GetLRSpace(); diff --git a/sw/source/core/objectpositioning/tolayoutanchoredobjectposition.cxx b/sw/source/core/objectpositioning/tolayoutanchoredobjectposition.cxx index 9e3317db6a25..3567441ae68b 100644 --- a/sw/source/core/objectpositioning/tolayoutanchoredobjectposition.cxx +++ b/sw/source/core/objectpositioning/tolayoutanchoredobjectposition.cxx @@ -39,6 +39,9 @@ #include <fmtsrnd.hxx> #include <IDocumentSettingAccess.hxx> #include <frmatr.hxx> +#include "viewsh.hxx" +#include "viewopt.hxx" +#include "rootfrm.hxx" #include <editeng/lrspitem.hxx> #include <editeng/ulspitem.hxx> @@ -134,8 +137,9 @@ void SwToLayoutAnchoredObjectPosition::CalcPosition() // if in online-layout the bottom of to-page anchored object is beyond // the page bottom, the page frame has to grow by growing its body frame. + const ViewShell *pSh = GetAnchorFrm().getRootFrm()->GetCurrShell(); if ( !bFlyAtFly && GetAnchorFrm().IsPageFrm() && - rFrmFmt.getIDocumentSettingAccess()->get(IDocumentSettingAccess::BROWSE_MODE) ) + pSh && pSh->GetViewOptions()->getBrowseMode() ) { const long nAnchorBottom = GetAnchorFrm().Frm().Bottom(); const long nBottom = GetAnchorFrm().Frm().Top() + diff --git a/sw/source/core/ole/ndole.cxx b/sw/source/core/ole/ndole.cxx index 5026ade3073b..a9b3d43007fb 100644 --- a/sw/source/core/ole/ndole.cxx +++ b/sw/source/core/ole/ndole.cxx @@ -777,7 +777,7 @@ const uno::Reference < embed::XEmbeddedObject > SwOLEObj::GetOleRef() { //Das Teil konnte nicht geladen werden (wahrsch. Kaputt). Rectangle aArea; - SwFrm *pFrm = pOLENd->GetFrm(); + SwFrm *pFrm = pOLENd->getLayoutFrm(0); if ( pFrm ) { Size aSz( pFrm->Frm().SSize() ); diff --git a/sw/source/core/para/paratr.cxx b/sw/source/core/para/paratr.cxx index ea8da3f45cc6..02c154b130f6 100644 --- a/sw/source/core/para/paratr.cxx +++ b/sw/source/core/para/paratr.cxx @@ -81,7 +81,7 @@ SwFmtDrop::SwFmtDrop() SwFmtDrop::SwFmtDrop( const SwFmtDrop &rCpy ) : SfxPoolItem( RES_PARATR_DROP ), - SwClient( rCpy.pRegisteredIn ), + SwClient( rCpy.GetRegisteredInNonConst() ), pDefinedIn( 0 ), nDistance( rCpy.GetDistance() ), nReadFmt( rCpy.nReadFmt ), @@ -102,8 +102,8 @@ SwFmtDrop::~SwFmtDrop() void SwFmtDrop::SetCharFmt( SwCharFmt *pNew ) { //Ummelden - if ( pRegisteredIn ) - pRegisteredIn->Remove( this ); + if ( GetRegisteredIn() ) + GetRegisteredInNonConst()->Remove( this ); if(pNew) pNew->Add( this ); nReadFmt = USHRT_MAX; @@ -111,26 +111,19 @@ void SwFmtDrop::SetCharFmt( SwCharFmt *pNew ) -void SwFmtDrop::Modify( SfxPoolItem *, SfxPoolItem * ) +void SwFmtDrop::Modify( const SfxPoolItem*, const SfxPoolItem * ) { if( pDefinedIn ) { if( !pDefinedIn->ISA( SwFmt )) - pDefinedIn->Modify( this, this ); + pDefinedIn->ModifyNotification( this, this ); else if( pDefinedIn->GetDepends() && !pDefinedIn->IsModifyLocked() ) { // selbst den Abhaengigen vom Format bescheid sagen. Das // Format selbst wuerde es nicht weitergeben, weil es ueber // die Abpruefung nicht hinauskommt. - SwClientIter aIter( *pDefinedIn ); - SwClient * pLast = aIter.GoStart(); - if( pLast ) // konnte zum Anfang gesprungen werden ?? - do { - pLast->Modify( this, this ); - if( !pDefinedIn->GetDepends() ) // Baum schon Weg ?? - break; - } while( 0 != ( pLast = aIter++ )); + pDefinedIn->ModifyBroadcast( this, this ); } } } diff --git a/sw/source/core/table/swnewtable.cxx b/sw/source/core/table/swnewtable.cxx index b184909ea25a..f11fcd0be3bf 100644 --- a/sw/source/core/table/swnewtable.cxx +++ b/sw/source/core/table/swnewtable.cxx @@ -48,6 +48,7 @@ #include <editeng/boxitem.hxx> #include <editeng/protitem.hxx> #include <swtblfmt.hxx> +#include <switerator.hxx> #if OSL_DEBUG_LEVEL > 1 #define CHECK_TABLE(t) (t).CheckConsistency(); @@ -589,11 +590,9 @@ SwBoxSelection* SwTable::CollectBoxSelection( const SwPaM& rPam ) const void lcl_InvalidateCellFrm( const SwTableBox& rBox ) { - SwClientIter aIter( *rBox.GetFrmFmt() ); - SwClient* pLast; - for( pLast = aIter.First( TYPE( SwFrm ) ); pLast; pLast = aIter.Next() ) + SwIterator<SwCellFrm,SwFmt> aIter( *rBox.GetFrmFmt() ); + for( SwCellFrm* pCell = aIter.First(); pCell; pCell = aIter.Next() ) { - SwCellFrm *pCell = (SwCellFrm*)pLast; if( pCell->GetTabBox() == &rBox ) { pCell->InvalidateSize(); @@ -1407,7 +1406,7 @@ sal_Bool SwTable::NewSplitRow( SwDoc* pDoc, const SwSelBoxes& rBoxes, sal_uInt16 _FndBox aFndBox( 0, 0 ); aFndBox.SetTableLines( rBoxes, *this ); - if( bSameHeight && pDoc->GetRootFrm() ) + if( bSameHeight && pDoc->GetCurrentViewShell() ) //swmod 071108//swmod 071225 { SwSplitLines aRowLines; SwSplitLines aSplitLines; diff --git a/sw/source/core/table/swtable.cxx b/sw/source/core/table/swtable.cxx index a8ecdec41c56..dacefa85268c 100644 --- a/sw/source/core/table/swtable.cxx +++ b/sw/source/core/table/swtable.cxx @@ -39,7 +39,6 @@ #include <editeng/colritem.hxx> #include <sfx2/linkmgr.hxx> #include <editeng/boxitem.hxx> - #include <fmtfsize.hxx> #include <fmtornt.hxx> #include <fmtpdsc.hxx> @@ -68,6 +67,7 @@ #include <viewsh.hxx> #include <redline.hxx> #include <list> +#include <switerator.hxx> #if OSL_DEBUG_LEVEL > 1 #define CHECK_TABLE(t) (t).CheckConsistency(); @@ -320,7 +320,6 @@ SwTable::~SwTable() delete pHTMLLayout; } - /************************************************************************* |* |* SwTable::Modify() @@ -401,7 +400,7 @@ void lcl_ModifyBoxes( SwTableBoxes &rBoxes, const long nOld, } } -void SwTable::Modify( SfxPoolItem *pOld, SfxPoolItem *pNew ) +void SwTable::Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew ) { // fange SSize Aenderungen ab, um die Lines/Boxen anzupassen sal_uInt16 nWhich = pOld ? pOld->Which() : pNew ? pNew->Which() : 0 ; @@ -418,6 +417,8 @@ void SwTable::Modify( SfxPoolItem *pOld, SfxPoolItem *pNew ) pOldSize = (const SwFmtFrmSize*)pOld; pNewSize = (const SwFmtFrmSize*)pNew; } + else + CheckRegistration( pOld, pNew ); if( pOldSize || pNewSize ) { @@ -429,8 +430,6 @@ void SwTable::Modify( SfxPoolItem *pOld, SfxPoolItem *pNew ) AdjustWidths( pOldSize->GetWidth(), pNewSize->GetWidth() ); } } - else - SwClient::Modify( pOld, pNew ); // fuers ObjectDying } void SwTable::AdjustWidths( const long nOld, const long nNew ) @@ -1530,8 +1529,7 @@ SwTableBox* SwTable::GetTblBox( sal_uLong nSttIdx ) pModify = pTblNd->GetTable().GetFrmFmt(); // <-- - SwClientIter aIter( *pModify ); - SwFrm *pFrm = (SwFrm*)aIter.First( TYPE(SwFrm) ); + SwFrm* pFrm = SwIterator<SwFrm,SwModify>::FirstElement( *pModify ); while ( pFrm && !pFrm->IsCellFrm() ) pFrm = pFrm->GetUpper(); if ( pFrm ) @@ -1591,49 +1589,48 @@ SwTableLine::~SwTableLine() |*************************************************************************/ SwFrmFmt* SwTableLine::ClaimFrmFmt() { - //Wenn noch andere TableLines ausser mir selbst an dem FrmFmt haengen, - //sehe ich mich leider gezwungen mir ein eingenes zu machen und mich - //bei diesem anzumelden. - SwTableLineFmt *pOld = (SwTableLineFmt*)GetFrmFmt(); - SwClientIter aIter( *pOld ); - - SwClient* pLast; - - for( pLast = aIter.First( TYPE( SwTableLine )); pLast && pLast == this; - pLast = aIter.Next() ) - ; - - if( pLast ) - { - SwTableLineFmt *pNewFmt = pOld->GetDoc()->MakeTableLineFmt(); - *pNewFmt = *pOld; - - //Erstmal die Frms ummelden. - for( pLast = aIter.First( TYPE( SwFrm ) ); pLast; pLast = aIter.Next() ) - if( ((SwRowFrm*)pLast)->GetTabLine() == this ) - pNewFmt->Add( pLast ); - - //Jetzt noch mich selbst ummelden. - pNewFmt->Add( this ); - pOld = pNewFmt; + // This method makes sure that this object is an exclusive SwTableLine client + // of an SwTableLineFmt object + // If other SwTableLine objects currently listen to the same SwTableLineFmt as + // this one, something needs to be done + SwTableLineFmt *pRet = (SwTableLineFmt*)GetFrmFmt(); + SwIterator<SwTableLine,SwFmt> aIter( *pRet ); + for( SwTableLine* pLast = aIter.First(); pLast; pLast = aIter.Next() ) + { + if ( pLast != this ) + { + // found another SwTableLine that is a client of the current Fmt + // create a new Fmt as a copy and use it for this object + SwTableLineFmt *pNewFmt = pRet->GetDoc()->MakeTableLineFmt(); + *pNewFmt = *pRet; + + // register SwRowFrms that know me as clients at the new Fmt + SwIterator<SwRowFrm,SwFmt> aFrmIter( *pRet ); + for( SwRowFrm* pFrm = aFrmIter.First(); pFrm; pFrm = aFrmIter.Next() ) + if( pFrm->GetTabLine() == this ) + pFrm->RegisterToFormat( *pNewFmt ); + + // register myself + pNewFmt->Add( this ); + pRet = pNewFmt; + break; + } } - return pOld; + return pRet; } void SwTableLine::ChgFrmFmt( SwTableLineFmt *pNewFmt ) { SwFrmFmt *pOld = GetFrmFmt(); - SwClientIter aIter( *pOld ); - SwClient* pLast; + SwIterator<SwRowFrm,SwFmt> aIter( *pOld ); //Erstmal die Frms ummelden. - for( pLast = aIter.First( TYPE( SwFrm ) ); pLast; pLast = aIter.Next() ) + for( SwRowFrm* pRow = aIter.First(); pRow; pRow = aIter.Next() ) { - SwRowFrm *pRow = (SwRowFrm*)pLast; if( pRow->GetTabLine() == this ) { - pNewFmt->Add( pLast ); + pRow->RegisterToFormat( *pNewFmt ); pRow->InvalidateSize(); pRow->_InvalidatePrt(); @@ -1664,7 +1661,7 @@ void SwTableLine::ChgFrmFmt( SwTableLineFmt *pNewFmt ) //Jetzt noch mich selbst ummelden. pNewFmt->Add( this ); - if ( !aIter.GoStart() ) + if ( !pOld->GetDepends() ) delete pOld; } @@ -1672,16 +1669,15 @@ SwTwips SwTableLine::GetTableLineHeight( bool& bLayoutAvailable ) const { SwTwips nRet = 0; bLayoutAvailable = false; - SwClientIter aIter( *GetFrmFmt() ); + SwIterator<SwRowFrm,SwFmt> aIter( *GetFrmFmt() ); // A row could appear several times in headers/footers so only one chain of master/follow tables // will be accepted... const SwTabFrm* pChain = NULL; // My chain - for( SwClient* pLast = aIter.First( TYPE( SwFrm ) ); pLast; - pLast = aIter.Next() ) + for( SwRowFrm* pLast = aIter.First(); pLast; pLast = aIter.Next() ) { - if( ((SwRowFrm*)pLast)->GetTabLine() == this ) + if( pLast->GetTabLine() == this ) { - const SwTabFrm* pTab = static_cast<SwRowFrm*>(pLast)->FindTabFrm(); + const SwTabFrm* pTab = pLast->FindTabFrm(); bLayoutAvailable = ( pTab && pTab->IsVertical() ) ? ( 0 < pTab->Frm().Height() ) : ( 0 < pTab->Frm().Width() ); @@ -1692,15 +1688,15 @@ SwTwips SwTableLine::GetTableLineHeight( bool& bLayoutAvailable ) const { pChain = pTab; // defines my chain (even it is already) if( pTab->IsVertical() ) - nRet += static_cast<SwRowFrm*>(pLast)->Frm().Width(); + nRet += pLast->Frm().Width(); else - nRet += static_cast<SwRowFrm*>(pLast)->Frm().Height(); + nRet += pLast->Frm().Height(); // Optimization, if there are no master/follows in my chain, nothing more to add if( !pTab->HasFollow() && !pTab->IsFollow() ) break; // This is not an optimization, this is necessary to avoid double additions of // repeating rows - if( pTab->IsInHeadline( *static_cast<SwRowFrm*>(pLast) ) ) + if( pTab->IsInHeadline(*pLast) ) break; } } @@ -1792,7 +1788,7 @@ SwTableBoxFmt* SwTableBox::CheckBoxFmt( SwTableBoxFmt* pFmt ) if( SFX_ITEM_SET == pFmt->GetItemState( RES_BOXATR_VALUE, sal_False ) || SFX_ITEM_SET == pFmt->GetItemState( RES_BOXATR_FORMULA, sal_False ) ) { - SwClient* pOther = SwClientIter( *pFmt ).First( TYPE( SwTableBox )); + SwTableBox* pOther = SwIterator<SwTableBox,SwFmt>::FirstElement( *pFmt ); if( pOther ) { SwTableBoxFmt* pNewFmt = pFmt->GetDoc()->MakeTableBoxFmt(); @@ -1816,53 +1812,51 @@ SwTableBoxFmt* SwTableBox::CheckBoxFmt( SwTableBoxFmt* pFmt ) |*************************************************************************/ SwFrmFmt* SwTableBox::ClaimFrmFmt() { - //Wenn noch andere TableBoxen ausser mir selbst an dem FrmFmt haengen, - //sehe ich mich leider gezwungen mir ein eingenes zu machen und mich - //bei diesem anzumelden. - SwTableBoxFmt *pOld = (SwTableBoxFmt*)GetFrmFmt(); - SwClientIter aIter( *pOld ); - SwClient* pLast; - - for( pLast = aIter.First( TYPE( SwTableBox )); pLast && pLast == this; - pLast = aIter.Next() ) - ; - - if( pLast ) + // This method makes sure that this object is an exclusive SwTableBox client + // of an SwTableBoxFmt object + // If other SwTableBox objects currently listen to the same SwTableBoxFmt as + // this one, something needs to be done + SwTableBoxFmt *pRet = (SwTableBoxFmt*)GetFrmFmt(); + SwIterator<SwTableBox,SwFmt> aIter( *pRet ); + for( SwTableBox* pLast = aIter.First(); pLast; pLast = aIter.Next() ) { - SwTableBoxFmt* pNewFmt = pOld->GetDoc()->MakeTableBoxFmt(); - - pNewFmt->LockModify(); - *pNewFmt = *pOld; - - // Values und Formeln nie kopieren - pNewFmt->ResetFmtAttr( RES_BOXATR_FORMULA, RES_BOXATR_VALUE ); - pNewFmt->UnlockModify(); + if ( pLast != this ) + { + // Found another SwTableBox object + // create a new Fmt as a copy and assign me to it + // don't copy values and formulas + SwTableBoxFmt* pNewFmt = pRet->GetDoc()->MakeTableBoxFmt(); + pNewFmt->LockModify(); + *pNewFmt = *pRet; + pNewFmt->ResetFmtAttr( RES_BOXATR_FORMULA, RES_BOXATR_VALUE ); + pNewFmt->UnlockModify(); - //Erstmal die Frms ummelden. - for( pLast = aIter.First( TYPE( SwFrm ) ); pLast; pLast = aIter.Next() ) - if( ((SwCellFrm*)pLast)->GetTabBox() == this ) - pNewFmt->Add( pLast ); + // re-register SwCellFrm objects that know me + SwIterator<SwCellFrm,SwFmt> aFrmIter( *pRet ); + for( SwCellFrm* pCell = aFrmIter.First(); pCell; pCell = aFrmIter.Next() ) + if( pCell->GetTabBox() == this ) + pCell->RegisterToFormat( *pNewFmt ); - //Jetzt noch mich selbst ummelden. - pNewFmt->Add( this ); - pOld = pNewFmt; + // re-register myself + pNewFmt->Add( this ); + pRet = pNewFmt; + break; + } } - return pOld; + return pRet; } void SwTableBox::ChgFrmFmt( SwTableBoxFmt* pNewFmt ) { SwFrmFmt *pOld = GetFrmFmt(); - SwClientIter aIter( *pOld ); - SwClient* pLast; + SwIterator<SwCellFrm,SwFmt> aIter( *pOld ); //Erstmal die Frms ummelden. - for( pLast = aIter.First( TYPE( SwFrm ) ); pLast; pLast = aIter.Next() ) + for( SwCellFrm* pCell = aIter.First(); pCell; pCell = aIter.Next() ) { - SwCellFrm *pCell = (SwCellFrm*)pLast; if( pCell->GetTabBox() == this ) { - pNewFmt->Add( pLast ); + pCell->RegisterToFormat( *pNewFmt ); pCell->InvalidateSize(); pCell->_InvalidatePrt(); pCell->SetCompletePaint(); @@ -1887,7 +1881,7 @@ void SwTableBox::ChgFrmFmt( SwTableBoxFmt* pNewFmt ) //Jetzt noch mich selbst ummelden. pNewFmt->Add( this ); - if( !aIter.GoStart() ) + if( !pOld->GetDepends() ) delete pOld; } @@ -2007,8 +2001,7 @@ sal_Bool SwTable::GetInfo( SfxPoolItem& rInfo ) const case RES_CONTENT_VISIBLE: { - ((SwPtrMsgPoolItem&)rInfo).pObject = - SwClientIter( *GetFrmFmt() ).First( TYPE(SwFrm) ); + ((SwPtrMsgPoolItem&)rInfo).pObject = SwIterator<SwFrm,SwFmt>::FirstElement( *GetFrmFmt() ); } return sal_False; } @@ -2018,7 +2011,7 @@ sal_Bool SwTable::GetInfo( SfxPoolItem& rInfo ) const SwTable * SwTable::FindTable( SwFrmFmt const*const pFmt ) { return (pFmt) - ? static_cast<SwTable*>(SwClientIter(*pFmt).First( TYPE(SwTable) )) + ? SwIterator<SwTable,SwFmt>::FirstElement(*pFmt) : 0; } @@ -2257,7 +2250,7 @@ void ChgNumToText( SwTableBox& rBox, sal_uLong nFmt ) } // zum Erkennen von Veraenderungen (haupts. TableBoxAttribute) -void SwTableBoxFmt::Modify( SfxPoolItem* pOld, SfxPoolItem* pNew ) +void SwTableBoxFmt::Modify( const SfxPoolItem* pOld, const SfxPoolItem* pNew ) { if( !IsModifyLocked() && !IsInDocDTOR() ) { @@ -2309,8 +2302,8 @@ void SwTableBoxFmt::Modify( SfxPoolItem* pOld, SfxPoolItem* pNew ) SFX_ITEM_SET == GetItemState( RES_BOXATR_FORMULA, sal_False ) ) { // die Box holen - SwClientIter aIter( *this ); - SwTableBox* pBox = (SwTableBox*)aIter.First( TYPE( SwTableBox ) ); + SwIterator<SwTableBox,SwFmt> aIter( *this ); + SwTableBox* pBox = aIter.First(); if( pBox ) { OSL_ENSURE( !aIter.Next(), "keine Box oder mehrere am Format" ); @@ -2677,11 +2670,7 @@ public: void setTable(const SwTable * pTable) { m_pTable = pTable; SwFrmFmt * pFrmFmt = m_pTable->GetFrmFmt(); - SwClientIter aIter(*pFrmFmt); - - m_pTabFrm = - static_cast<const SwTabFrm *>(aIter.First(TYPE(SwTabFrm))); - + m_pTabFrm = SwIterator<SwTabFrm,SwFmt>::FirstElement(*pFrmFmt); if (m_pTabFrm->IsFollow()) m_pTabFrm = m_pTabFrm->FindMaster(true); } @@ -2816,4 +2805,26 @@ const SwTableBox * SwTableCellInfo::getTableBox() const return pRet; } -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ +void SwTable::RegisterToFormat( SwFmt& rFmt ) +{ + rFmt.Add( this ); +} + +void SwTableLine::RegisterToFormat( SwFmt& rFmt ) +{ + rFmt.Add( this ); +} + +void SwTableBox::RegisterToFormat( SwFmt& rFmt ) +{ + rFmt.Add( this ); +} + +void SwTableBox::ForgetFrmFmt() +{ + if ( GetRegisteredIn() ) + GetRegisteredInNonConst()->Remove(this); +} + + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
\ No newline at end of file diff --git a/sw/source/core/text/EnhancedPDFExportHelper.cxx b/sw/source/core/text/EnhancedPDFExportHelper.cxx index dc6db207b65a..623272cd4919 100644 --- a/sw/source/core/text/EnhancedPDFExportHelper.cxx +++ b/sw/source/core/text/EnhancedPDFExportHelper.cxx @@ -82,7 +82,7 @@ #include "i18npool/mslangid.hxx" #include <IMark.hxx> #include <SwNodeNum.hxx> - +#include <switerator.hxx> #include <stack> #include <tools/globname.hxx> @@ -1590,22 +1590,19 @@ void SwEnhancedPDFExportHelper::EnhancedPDFExport() if ( pPDFExtOutDevData->GetIsExportNotes() ) { SwFieldType* pType = mrSh.GetFldType( RES_POSTITFLD, aEmptyStr ); - SwClientIter aIter( *pType ); - const SwClient * pFirst = aIter.GoStart(); - while( pFirst ) + SwIterator<SwFmtFld,SwFieldType> aIter( *pType ); + for( SwFmtFld* pFirst = aIter.First(); pFirst; ) { - if( ((SwFmtFld*)pFirst)->GetTxtFld() && - ((SwFmtFld*)pFirst)->IsFldInDoc()) + if( pFirst->GetTxtFld() && pFirst->IsFldInDoc() ) { - const SwTxtNode* pTNd = - (SwTxtNode*)((SwFmtFld*)pFirst)->GetTxtFld()->GetpTxtNode(); + const SwTxtNode* pTNd = (SwTxtNode*)pFirst->GetTxtFld()->GetpTxtNode(); OSL_ENSURE( 0 != pTNd, "Enhanced pdf export - text node is missing" ); // 1. Check if the whole paragraph is hidden // 2. Move to the field // 3. Check for hidden text attribute if ( !pTNd->IsHidden() && - mrSh.GotoFld( *(SwFmtFld*)pFirst ) && + mrSh.GotoFld( *pFirst ) && !mrSh.SelectHiddenRange() ) { // Link Rectangle @@ -1619,7 +1616,7 @@ void SwEnhancedPDFExportHelper::EnhancedPDFExport() vcl::PDFNote aNote; // Use the NumberFormatter to get the date string: - const SwPostItField* pField = (SwPostItField*)((SwFmtFld*)pFirst)->GetFld(); + const SwPostItField* pField = (SwPostItField*)pFirst->GetFld(); SvNumberFormatter* pNumFormatter = pDoc->GetNumberFormatter(); const Date aDateDiff( pField->GetDate() - *pNumFormatter->GetNullDate() ); @@ -1642,7 +1639,7 @@ void SwEnhancedPDFExportHelper::EnhancedPDFExport() } } } - pFirst = aIter++; + pFirst = aIter.Next(); mrSh.SwCrsrShell::ClearMark(); } } @@ -1832,22 +1829,19 @@ void SwEnhancedPDFExportHelper::EnhancedPDFExport() // REFERENCES // SwFieldType* pType = mrSh.GetFldType( RES_GETREFFLD, aEmptyStr ); - SwClientIter aIter( *pType ); - const SwClient * pFirst = aIter.GoStart(); - while( pFirst ) + SwIterator<SwFmtFld,SwFieldType> aIter( *pType ); + for( SwFmtFld* pFirst = aIter.First(); pFirst; ) { - if( ((SwFmtFld*)pFirst)->GetTxtFld() && - ((SwFmtFld*)pFirst)->IsFldInDoc()) + if( pFirst->GetTxtFld() && pFirst->IsFldInDoc() ) { - const SwTxtNode* pTNd = - (SwTxtNode*)((SwFmtFld*)pFirst)->GetTxtFld()->GetpTxtNode(); + const SwTxtNode* pTNd = (SwTxtNode*)pFirst->GetTxtFld()->GetpTxtNode(); OSL_ENSURE( 0 != pTNd, "Enhanced pdf export - text node is missing" ); // 1. Check if the whole paragraph is hidden // 2. Move to the field // 3. Check for hidden text attribute if ( !pTNd->IsHidden() && - mrSh.GotoFld( *(SwFmtFld*)pFirst ) && + mrSh.GotoFld( *pFirst ) && !mrSh.SelectHiddenRange() ) { // Select the field: @@ -1863,7 +1857,7 @@ void SwEnhancedPDFExportHelper::EnhancedPDFExport() // Destination Rectangle const SwGetRefField* pField = - (SwGetRefField*)((SwFmtFld*)pFirst)->GetFld(); + (SwGetRefField*)pFirst->GetFld(); const String& rRefName = pField->GetSetRefName(); mrSh.GotoRefMark( rRefName, pField->GetSubType(), pField->GetSeqNo() ); const SwRect& rDestRect = mrSh.GetCharRect(); @@ -1916,7 +1910,7 @@ void SwEnhancedPDFExportHelper::EnhancedPDFExport() } } } - pFirst = aIter++; + pFirst = aIter.Next(); mrSh.SwCrsrShell::ClearMark(); } @@ -2176,15 +2170,10 @@ void SwEnhancedPDFExportHelper::MakeHeaderFooterLinks( vcl::PDFExtOutDevData& rP // the offset of the link rectangle calculates as follows: const Point aOffset = rLinkRect.Pos() + mrOut.GetMapMode().GetOrigin(); - SwClientIter aClientIter( const_cast<SwTxtNode&>(rTNd) ); - SwClient* pLast = aClientIter.GoStart(); - - while( pLast ) - { - if ( pLast->ISA( SwTxtFrm ) ) + SwIterator<SwTxtFrm,SwTxtNode> aIter( rTNd ); + for ( SwTxtFrm* pTmpFrm = aIter.First(); pTmpFrm; pTmpFrm = aIter.Next() ) { // Add offset to current page: - SwTxtFrm* pTmpFrm = static_cast<SwTxtFrm*>(pLast); const SwPageFrm* pPageFrm = pTmpFrm->FindPageFrm(); SwRect aHFLinkRect( rLinkRect ); aHFLinkRect.Pos() = pPageFrm->Frm().Pos() + aOffset; @@ -2211,9 +2200,6 @@ void SwEnhancedPDFExportHelper::MakeHeaderFooterLinks( vcl::PDFExtOutDevData& rP } } } - - pLast = ++aClientIter; - } } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/source/core/text/blink.cxx b/sw/source/core/text/blink.cxx index 596820a3ab0d..fac71e3b7d5b 100644 --- a/sw/source/core/text/blink.cxx +++ b/sw/source/core/text/blink.cxx @@ -150,7 +150,7 @@ void SwBlink::Insert( const Point& rPoint, const SwLinePortion* pPor, else { pBlinkPor->SetPos( rPoint ); - pBlinkPor->SetRootFrm( pTxtFrm->FindRootFrm() ); + pBlinkPor->SetRootFrm( pTxtFrm->getRootFrm() ); aList.Insert( pBlinkPor ); pTxtFrm->SetBlinkPor(); if( pPor->IsLayPortion() || pPor->IsParaPortion() ) diff --git a/sw/source/core/text/frmcrsr.cxx b/sw/source/core/text/frmcrsr.cxx index 87b56063b87a..2f35e82649b5 100644 --- a/sw/source/core/text/frmcrsr.cxx +++ b/sw/source/core/text/frmcrsr.cxx @@ -35,6 +35,7 @@ #include "frmtool.hxx" #include "viewopt.hxx" #include "paratr.hxx" +#include "rootfrm.hxx" #include "pagefrm.hxx" #include "colfrm.hxx" #include "txttypes.hxx" @@ -131,7 +132,7 @@ sal_Bool lcl_ChangeOffset( SwTxtFrm* pFrm, xub_StrLen nNew ) !pFly->GetNextLink() && !pFly->GetPrevLink() ) || ( !pFly && pFrm->IsInTab() ) ) { - ViewShell* pVsh = pFrm->GetShell(); + ViewShell* pVsh = pFrm->getRootFrm()->GetCurrShell(); if( pVsh ) { if( pVsh->GetNext() != pVsh || @@ -145,7 +146,7 @@ sal_Bool lcl_ChangeOffset( SwTxtFrm* pFrm, xub_StrLen nNew ) pFrm->SetPara( 0 ); pFrm->GetFormatted(); if( pFrm->Frm().HasArea() ) - pFrm->GetShell()->InvalidateWindows( pFrm->Frm() ); + pFrm->getRootFrm()->GetCurrShell()->InvalidateWindows( pFrm->Frm() ); return sal_True; } } @@ -927,7 +928,7 @@ sal_Bool SwTxtFrm::_UnitUp( SwPaM *pPam, const SwTwips nOffset, xub_StrLen nOffs = GetOfst(); if( pTmpPrev ) { - ViewShell *pSh = GetShell(); + ViewShell *pSh = getRootFrm()->GetCurrShell(); sal_Bool bProtectedAllowed = pSh && pSh->GetViewOptions()->IsCursorInProtectedArea(); const SwTxtFrm *pPrevPrev = pTmpPrev; // Hier werden geschuetzte Frames und Frame ohne Inhalt ausgelassen @@ -1282,7 +1283,7 @@ sal_Bool SwTxtFrm::_UnitDown(SwPaM *pPam, const SwTwips nOffset, if( 0 != ( pTmpFollow = GetFollow() ) ) { // geschuetzte Follows auslassen const SwCntntFrm* pTmp = pTmpFollow; - ViewShell *pSh = GetShell(); + ViewShell *pSh = getRootFrm()->GetCurrShell(); if( !pSh || !pSh->GetViewOptions()->IsCursorInProtectedArea() ) { while( pTmpFollow && pTmpFollow->IsProtected() ) @@ -1442,7 +1443,7 @@ void SwTxtFrm::FillCrsrPos( SwFillData& rFill ) const pColl = &pColl->GetNextTxtFmtColl(); SwAttrSet aSet( ((SwDoc*)GetTxtNode()->GetDoc())->GetAttrPool(), aTxtFmtCollSetRange ); const SwAttrSet* pSet = &pColl->GetAttrSet(); - ViewShell *pSh = GetShell(); + ViewShell *pSh = getRootFrm()->GetCurrShell(); if( GetTxtNode()->HasSwAttrSet() ) { aSet.Put( *GetTxtNode()->GetpSwAttrSet() ); @@ -1457,8 +1458,7 @@ void SwTxtFrm::FillCrsrPos( SwFillData& rFill ) const pFnt->ChkMagic( pSh, pFnt->GetActual() ); } OutputDevice* pOut = pSh->GetOut(); - if ( !GetTxtNode()->getIDocumentSettingAccess()->get(IDocumentSettingAccess::BROWSE_MODE) || - ( pSh->GetViewOptions()->IsPrtFormat() ) ) + if( !pSh->GetViewOptions()->getBrowseMode() || pSh->GetViewOptions()->IsPrtFormat() ) pOut = GetTxtNode()->getIDocumentDeviceAccess()->getReferenceDevice( true ); pFnt->SetFntChg( sal_True ); diff --git a/sw/source/core/text/frmform.cxx b/sw/source/core/text/frmform.cxx index 974c1faea40e..e28b1694d8a6 100644 --- a/sw/source/core/text/frmform.cxx +++ b/sw/source/core/text/frmform.cxx @@ -673,7 +673,7 @@ SwCntntFrm *SwTxtFrm::JoinFrm() // and relation CONTENT_FLOWS_TO for current previous paragraph, which // is <this>, will change. { - ViewShell* pViewShell( pFoll->GetShell() ); + ViewShell* pViewShell( pFoll->getRootFrm()->GetCurrShell() ); if ( pViewShell && pViewShell->GetLayout() && pViewShell->GetLayout()->IsAnyShellAccessible() ) { @@ -700,7 +700,7 @@ SwCntntFrm *SwTxtFrm::SplitFrm( const xub_StrLen nTxtPos ) // Durch das Paste wird ein Modify() an mich verschickt. // Damit meine Daten nicht verschwinden, locke ich mich. SwTxtFrmLocker aLock( this ); - SwTxtFrm *pNew = (SwTxtFrm *)(GetTxtNode()->MakeFrm()); + SwTxtFrm *pNew = (SwTxtFrm *)(GetTxtNode()->MakeFrm( this )); pNew->bIsFollow = sal_True; pNew->SetFollow( GetFollow() ); @@ -713,7 +713,7 @@ SwCntntFrm *SwTxtFrm::SplitFrm( const xub_StrLen nTxtPos ) // and relation CONTENT_FLOWS_TO for current previous paragraph, which // is <this>, will change. { - ViewShell* pViewShell( pNew->GetShell() ); + ViewShell* pViewShell( pNew->getRootFrm()->GetCurrShell() ); if ( pViewShell && pViewShell->GetLayout() && pViewShell->GetLayout()->IsAnyShellAccessible() ) { @@ -1235,7 +1235,7 @@ sal_Bool SwTxtFrm::FormatLine( SwTxtFormatter &rLine, const sal_Bool bPrev ) } SwTwips nRght = Max( nOldWidth, pNew->Width() + pNew->GetHangingMargin() ); - ViewShell *pSh = GetShell(); + ViewShell *pSh = getRootFrm()->GetCurrShell(); const SwViewOption *pOpt = pSh ? pSh->GetViewOptions() : 0; if( pOpt && (pOpt->IsParagraph() || pOpt->IsLineBreak()) ) nRght += ( Max( nOldAscent, pNew->GetAscent() ) ); diff --git a/sw/source/core/text/frmpaint.cxx b/sw/source/core/text/frmpaint.cxx index f8b6fe93cdd0..d20b8e328f49 100644 --- a/sw/source/core/text/frmpaint.cxx +++ b/sw/source/core/text/frmpaint.cxx @@ -42,6 +42,7 @@ #include <fmtline.hxx> #include <lineinfo.hxx> #include <charfmt.hxx> +#include "rootfrm.hxx" #include <pagefrm.hxx> #include <viewsh.hxx> // ViewShell #include <viewimp.hxx> // SwViewImp @@ -320,7 +321,7 @@ void SwTxtFrm::PaintExtraData( const SwRect &rRect ) const { if( IsLocked() || IsHiddenNow() || !Prt().Height() ) return; - ViewShell *pSh = GetShell(); + ViewShell *pSh = getRootFrm()->GetCurrShell(); SWAP_IF_NOT_SWAPPED( this ) SwRect rOldRect( rRect ); @@ -478,7 +479,7 @@ SwRect SwTxtFrm::Paint() sal_Bool SwTxtFrm::PaintEmpty( const SwRect &rRect, sal_Bool bCheck ) const { - ViewShell *pSh = GetShell(); + ViewShell *pSh = getRootFrm()->GetCurrShell(); if( pSh && ( pSh->GetViewOptions()->IsParagraph() || bInitFont ) ) { bInitFont = sal_False; @@ -605,7 +606,7 @@ void SwTxtFrm::Paint(SwRect const& rRect, SwPrintData const*const) const ResetRepaint(); // --> FME 2004-06-24 #i16816# tagged pdf support - ViewShell *pSh = GetShell(); + ViewShell *pSh = getRootFrm()->GetCurrShell(); Num_Info aNumInfo( *this ); SwTaggedPDFHelper aTaggedPDFHelperNumbering( &aNumInfo, 0, 0, *pSh->GetOut() ); diff --git a/sw/source/core/text/inftxt.cxx b/sw/source/core/text/inftxt.cxx index d1cd431aae70..f9e2f8f203b5 100644 --- a/sw/source/core/text/inftxt.cxx +++ b/sw/source/core/text/inftxt.cxx @@ -281,7 +281,7 @@ void SwTxtSizeInfo::CtorInitTxtSizeInfo( SwTxtFrm *pFrame, SwFont *pNewFnt, pFrm = pFrame; CtorInitTxtInfo( pFrm ); const SwTxtNode *pNd = pFrm->GetTxtNode(); - pVsh = pFrm->GetShell(); + pVsh = pFrm->getRootFrm()->GetCurrShell(); // Get the output and reference device if ( pVsh ) @@ -293,7 +293,7 @@ void SwTxtSizeInfo::CtorInitTxtSizeInfo( SwTxtFrm *pFrame, SwFont *pNewFnt, else { //Zugriff ueber StarONE, es muss keine Shell existieren oder aktiv sein. - if ( pNd->getIDocumentSettingAccess()->get(IDocumentSettingAccess::BROWSE_MODE) ) + if ( pNd->getIDocumentSettingAccess()->get(IDocumentSettingAccess::HTML_MODE) ) { //in Ermangelung eines Besseren kann hier ja wohl nur noch das //AppWin genommen werden? @@ -631,7 +631,7 @@ void SwTxtPaintInfo::_DrawText( const XubString &rText, const SwLinePortion &rPo if( GetFont()->IsBlink() && OnWin() && rPor.Width() ) { // check if accessibility options allow blinking portions: - const ViewShell* pSh = GetTxtFrm()->GetShell(); + const ViewShell* pSh = GetTxtFrm()->getRootFrm()->GetCurrShell(); if ( pSh && ! pSh->GetAccessibilityOptions()->IsStopAnimatedText() && ! pSh->IsPreView() ) { @@ -680,7 +680,7 @@ void SwTxtPaintInfo::_DrawText( const XubString &rText, const SwLinePortion &rPo const sal_Bool bTmpSmart = bSmartTag && OnWin() && !GetOpt().IsPagePreview() && SwSmartTagMgr::Get().IsSmartTagsEnabled(); // SMARTTAGS OSL_ENSURE( GetParaPortion(), "No paragraph!"); - SwDrawTextInfo aDrawInf( pFrm->GetShell(), *pOut, pSI, rText, nStart, nLength, + SwDrawTextInfo aDrawInf( pFrm->getRootFrm()->GetCurrShell(), *pOut, pSI, rText, nStart, nLength, rPor.Width(), bBullet ); aDrawInf.SetLeft( GetPaintRect().Left() ); diff --git a/sw/source/core/text/itratr.cxx b/sw/source/core/text/itratr.cxx index 354de3eca96b..cb1209b893be 100644 --- a/sw/source/core/text/itratr.cxx +++ b/sw/source/core/text/itratr.cxx @@ -34,7 +34,7 @@ #include <editeng/charscaleitem.hxx> #include <txtatr.hxx> #include <sfx2/printer.hxx> -#include <editeng/lrspitem.hxx> +#include <svx/svdobj.hxx> #include <vcl/window.hxx> #include <vcl/svapp.hxx> #include <fmtanchr.hxx> @@ -63,6 +63,8 @@ #include <breakit.hxx> #include <com/sun/star/i18n/WordType.hpp> #include <com/sun/star/i18n/ScriptType.hdl> +#include <editeng/lrspitem.hxx> +#include <switerator.hxx> using namespace ::com::sun::star::i18n; using namespace ::com::sun::star; @@ -430,15 +432,13 @@ sal_Bool lcl_MinMaxString( SwMinMaxArgs& rArg, SwFont* pFnt, const XubString &rT return bRet; } -sal_Bool SwTxtNode::IsSymbol( const xub_StrLen nBegin ) const +sal_Bool SwTxtNode::IsSymbol( const xub_StrLen nBegin ) const//swmodtest 080307 { SwScriptInfo aScriptInfo; SwAttrIter aIter( *(SwTxtNode*)this, aScriptInfo ); aIter.Seek( nBegin ); - const SwRootFrm* pTmpRootFrm = getIDocumentLayoutAccess()->GetRootFrm(); - return aIter.GetFnt()->IsSymbol( pTmpRootFrm ? - pTmpRootFrm->GetCurrShell() : - 0 ); + return aIter.GetFnt()->IsSymbol( + const_cast<ViewShell *>(getIDocumentLayoutAccess()->GetCurrentViewShell()) );//swmod 080311 } class SwMinMaxNodeArgs @@ -703,10 +703,8 @@ void SwTxtNode::GetMinMaxSize( sal_uLong nIndex, sal_uLong& rMin, sal_uLong &rMa case CHAR_HARDHYPHEN: { XubString sTmp( cChar ); - const SwRootFrm* pTmpRootFrm = getIDocumentLayoutAccess()->GetRootFrm(); - SwDrawTextInfo aDrawInf( pTmpRootFrm ? - pTmpRootFrm->GetCurrShell() : - 0, *pOut, 0, sTmp, 0, 1, 0, sal_False ); + SwDrawTextInfo aDrawInf( const_cast<ViewShell *>(getIDocumentLayoutAccess()->GetCurrentViewShell()), + *pOut, 0, sTmp, 0, 1, 0, sal_False );//swmod 080311 nAktWidth = aIter.GetFnt()->_GetTxtSize( aDrawInf ).Width(); aArg.nWordWidth += nAktWidth; aArg.nRowWidth += nAktWidth; @@ -840,7 +838,7 @@ sal_uInt16 SwTxtNode::GetScalingOfSelectedText( xub_StrLen nStt, xub_StrLen nEnd else { //Zugriff ueber StarONE, es muss keine Shell existieren oder aktiv sein. - if ( getIDocumentSettingAccess()->get(IDocumentSettingAccess::BROWSE_MODE) ) + if ( getIDocumentSettingAccess()->get(IDocumentSettingAccess::HTML_MODE) ) pOut = GetpApp()->GetDefaultDevice(); else pOut = getIDocumentDeviceAccess()->getReferenceDevice( true ); @@ -1001,15 +999,10 @@ sal_uInt16 SwTxtNode::GetScalingOfSelectedText( xub_StrLen nStt, xub_StrLen nEnd nWidth = Max( nWidth, nProWidth ); // search for a text frame this node belongs to - SwClientIter aClientIter( *(SwTxtNode*)this ); - SwClient* pLastFrm = aClientIter.GoStart(); + SwIterator<SwTxtFrm,SwTxtNode> aFrmIter( *this ); SwTxtFrm* pFrm = 0; - - while( pLastFrm ) + for( SwTxtFrm* pTmpFrm = aFrmIter.First(); pTmpFrm; pTmpFrm = aFrmIter.Next() ) { - if ( pLastFrm->ISA( SwTxtFrm ) ) - { - SwTxtFrm* pTmpFrm = ( SwTxtFrm* )pLastFrm; if ( pTmpFrm->GetOfst() <= nStt && ( !pTmpFrm->GetFollow() || pTmpFrm->GetFollow()->GetOfst() > nStt ) ) @@ -1018,8 +1011,6 @@ sal_uInt16 SwTxtNode::GetScalingOfSelectedText( xub_StrLen nStt, xub_StrLen nEnd break; } } - pLastFrm = ++aClientIter; - } // search for the line containing nStt if ( pFrm && pFrm->HasPara() ) @@ -1060,16 +1051,12 @@ sal_uInt16 SwTxtNode::GetWidthOfLeadingTabs() const aPos.nContent += nIdx; // Find the non-follow text frame: - SwClientIter aClientIter( (SwTxtNode&)*this ); - SwClient* pLastFrm = aClientIter.GoStart(); - - while( pLastFrm ) + SwIterator<SwTxtFrm,SwTxtNode> aIter( *this ); + for( SwTxtFrm* pFrm = aIter.First(); pFrm; pFrm = aIter.Next() ) { // Only consider master frames: - if ( pLastFrm->ISA(SwTxtFrm) && - !static_cast<SwTxtFrm*>(pLastFrm)->IsFollow() ) + if ( !pFrm->IsFollow() ) { - const SwTxtFrm* pFrm = static_cast<SwTxtFrm*>(pLastFrm); SWRECTFN( pFrm ) SwRect aRect; pFrm->GetCharRect( aRect, aPos ); @@ -1079,7 +1066,6 @@ sal_uInt16 SwTxtNode::GetWidthOfLeadingTabs() const (aRect.*fnRect->fnGetLeft)() - (pFrm->*fnRect->fnGetPrtLeft)() ); break; } - pLastFrm = ++aClientIter; } } diff --git a/sw/source/core/text/porfld.cxx b/sw/source/core/text/porfld.cxx index d806a9316a9c..e6548d6add0c 100644 --- a/sw/source/core/text/porfld.cxx +++ b/sw/source/core/text/porfld.cxx @@ -33,7 +33,6 @@ #include <hintids.hxx> #include <com/sun/star/i18n/ScriptType.hdl> - #include <vcl/graph.hxx> #include <editeng/brshitem.hxx> #include <vcl/metric.hxx> @@ -48,6 +47,7 @@ #include <viewsh.hxx> #include <docsh.hxx> #include <doc.hxx> +#include "rootfrm.hxx" #include <breakit.hxx> #include <porrst.hxx> #include <porftn.hxx> // SwFtnPortion @@ -997,7 +997,7 @@ void SwGrfNumPortion::Paint( const SwTxtPaintInfo &rInf ) const pViewShell && pViewShell->GetWin() ) { ( (Graphic*) pBrush->GetGraphic() )->StopAnimation(0,nId); - rInf.GetTxtFrm()->GetShell()->InvalidateWindows( aTmp ); + rInf.GetTxtFrm()->getRootFrm()->GetCurrShell()->InvalidateWindows( aTmp ); } @@ -1231,7 +1231,7 @@ sal_Bool SwCombinedPortion::Format( SwTxtFormatInfo &rInf ) } sal_uInt16 nTop = ( nCount + 1 ) / 2; // the first character of the second line - ViewShell *pSh = rInf.GetTxtFrm()->GetShell(); + ViewShell *pSh = rInf.GetTxtFrm()->getRootFrm()->GetCurrShell(); SwFont aTmpFont( *rInf.GetFont() ); SwFontSave aFontSave( rInf, &aTmpFont ); nProportion = 55; diff --git a/sw/source/core/text/porfly.cxx b/sw/source/core/text/porfly.cxx index 1d2f700f0fcc..c8515e1500f8 100644 --- a/sw/source/core/text/porfly.cxx +++ b/sw/source/core/text/porfly.cxx @@ -34,6 +34,7 @@ #include "dflyobj.hxx" // SwVirtFlyDrawObj #include "pam.hxx" // SwPosition #include "flyfrm.hxx" // SwFlyInCntFrm +#include "rootfrm.hxx" #include "frmfmt.hxx" // SwFrmFmt #include "viewsh.hxx" @@ -255,7 +256,7 @@ void SwFlyCntPortion::Paint( const SwTxtPaintInfo &rInf ) const if( (GetFlyFrm()->IsCompletePaint() || GetFlyFrm()->Frm().IsOver( aRepaintRect )) && SwFlyFrm::IsPaint( (SdrObject*)GetFlyFrm()->GetVirtDrawObj(), - GetFlyFrm()->GetShell() )) + GetFlyFrm()->getRootFrm()->GetCurrShell() )) { SwRect aRect( GetFlyFrm()->Frm() ); if( !GetFlyFrm()->IsCompletePaint() ) diff --git a/sw/source/core/text/porlay.cxx b/sw/source/core/text/porlay.cxx index 30ab58ebac06..5da6fd03f352 100644 --- a/sw/source/core/text/porlay.cxx +++ b/sw/source/core/text/porlay.cxx @@ -56,11 +56,8 @@ #include <fchrfmt.hxx> #include <docary.hxx> // SwRedlineTbl #include <redline.hxx> // SwRedline - -// --> FME 2004-06-08 #i12836# enhanced pdf export #include <section.hxx> -// <-- - +#include <switerator.hxx> #include <IDocumentRedlineAccess.hxx> #include <IDocumentSettingAccess.hxx> #include <IDocumentContentOperations.hxx> @@ -2210,15 +2207,12 @@ sal_uInt16 SwScriptInfo::ThaiJustify( const XubString& rTxt, sal_Int32* pKernArr SwScriptInfo* SwScriptInfo::GetScriptInfo( const SwTxtNode& rTNd, sal_Bool bAllowInvalid ) { - SwClientIter aClientIter( (SwTxtNode&)rTNd ); - SwClient* pLast = aClientIter.GoStart(); + SwIterator<SwTxtFrm,SwTxtNode> aIter( rTNd ); SwScriptInfo* pScriptInfo = 0; - while( pLast ) + for( SwTxtFrm* pLast = aIter.First(); pLast; pLast = aIter.Next() ) { - if ( pLast->ISA( SwTxtFrm ) ) - { - pScriptInfo = (SwScriptInfo*)((SwTxtFrm*)pLast)->GetScriptInfo(); + pScriptInfo = (SwScriptInfo*)pLast->GetScriptInfo(); if ( pScriptInfo ) { if ( !bAllowInvalid && STRING_LEN != pScriptInfo->GetInvalidity() ) @@ -2226,8 +2220,6 @@ SwScriptInfo* SwScriptInfo::GetScriptInfo( const SwTxtNode& rTNd, else break; } } - pLast = ++aClientIter; - } return pScriptInfo; } diff --git a/sw/source/core/text/porrst.cxx b/sw/source/core/text/porrst.cxx index 985b854a9f78..62b158295004 100644 --- a/sw/source/core/text/porrst.cxx +++ b/sw/source/core/text/porrst.cxx @@ -53,6 +53,7 @@ #include <redlnitr.hxx> // SwRedlineItr #include <porfly.hxx> // SwFlyPortion #include <atrhndl.hxx> +#include "rootfrm.hxx" #include <IDocumentRedlineAccess.hxx> #include <IDocumentSettingAccess.hxx> @@ -231,7 +232,7 @@ SwLinePortion *SwArrowPortion::Compress() { return this; } SwTwips SwTxtFrm::EmptyHeight() const { if (IsCollapse()) { - ViewShell *pSh = GetShell(); + ViewShell *pSh = getRootFrm()->GetCurrShell(); if ( pSh->IsA( TYPE(SwCrsrShell) ) ) { SwCrsrShell *pCrSh=(SwCrsrShell*)pSh; SwCntntFrm *pCurrFrm=pCrSh->GetCurrFrm(); @@ -249,7 +250,7 @@ SwTwips SwTxtFrm::EmptyHeight() const SwFont *pFnt; const SwTxtNode& rTxtNode = *GetTxtNode(); const IDocumentSettingAccess* pIDSA = rTxtNode.getIDocumentSettingAccess(); - ViewShell *pSh = GetShell(); + ViewShell *pSh = getRootFrm()->GetCurrShell(); if ( rTxtNode.HasSwAttrSet() ) { const SwAttrSet *pAttrSet = &( rTxtNode.GetSwAttrSet() ); @@ -266,8 +267,8 @@ SwTwips SwTxtFrm::EmptyHeight() const pFnt->SetVertical( 2700 ); OutputDevice* pOut = pSh ? pSh->GetOut() : 0; - if ( !pOut || !pIDSA->get(IDocumentSettingAccess::BROWSE_MODE) || - ( pSh->GetViewOptions()->IsPrtFormat() ) ) + if ( !pOut || !pSh->GetViewOptions()->getBrowseMode() || + pSh->GetViewOptions()->IsPrtFormat() ) { pOut = rTxtNode.getIDocumentDeviceAccess()->getReferenceDevice(true); } @@ -409,13 +410,13 @@ sal_Bool SwTxtFrm::FillRegister( SwTwips& rRegStart, KSHORT& rRegDiff ) } else { - ViewShell *pSh = GetShell(); + ViewShell *pSh = getRootFrm()->GetCurrShell(); SwFontAccess aFontAccess( pFmt, pSh ); SwFont aFnt( *aFontAccess.Get()->GetFont() ); OutputDevice *pOut = 0; - if( !GetTxtNode()->getIDocumentSettingAccess()->get(IDocumentSettingAccess::BROWSE_MODE) || - (pSh && pSh->GetViewOptions()->IsPrtFormat()) ) + if( !pSh || !pSh->GetViewOptions()->getBrowseMode() || + pSh->GetViewOptions()->IsPrtFormat() ) pOut = GetTxtNode()->getIDocumentDeviceAccess()->getReferenceDevice( true ); if( pSh && !pOut ) diff --git a/sw/source/core/text/redlnitr.cxx b/sw/source/core/text/redlnitr.cxx index 78ec78789c52..441077728afe 100644 --- a/sw/source/core/text/redlnitr.cxx +++ b/sw/source/core/text/redlnitr.cxx @@ -61,8 +61,8 @@ using namespace ::com::sun::star; void SwAttrIter::CtorInitAttrIter( SwTxtNode& rTxtNode, SwScriptInfo& rScrInf, SwTxtFrm* pFrm ) { // Beim HTML-Import kann es vorkommen, dass kein Layout existiert. - SwRootFrm* pRootFrm = rTxtNode.getIDocumentLayoutAccess()->GetRootFrm(); - pShell = pRootFrm ? pRootFrm->GetShell() : 0; + SwRootFrm* pRootFrm = rTxtNode.getIDocumentLayoutAccess()->GetCurrentLayout(); + pShell = pRootFrm ? pRootFrm->GetCurrShell() : 0; //swmod 080218 pScriptInfo = &rScrInf; diff --git a/sw/source/core/text/txtdrop.cxx b/sw/source/core/text/txtdrop.cxx index 2012d2c221e8..298a3e91e3bd 100644 --- a/sw/source/core/text/txtdrop.cxx +++ b/sw/source/core/text/txtdrop.cxx @@ -49,6 +49,7 @@ #include <editeng/langitem.hxx> #include <charatr.hxx> #include <editeng/fhgtitem.hxx> +#include <switerator.hxx> using namespace ::com::sun::star::i18n; using namespace ::com::sun::star; @@ -227,21 +228,19 @@ bool SwTxtNode::GetDropSize(int& rFontHeight, int& rDropHeight, int& rDropDescen } // get text frame - SwClientIter aClientIter( (SwTxtNode&)*this ); - SwClient* pLastFrm = aClientIter.GoStart(); - - while( pLastFrm ) + SwIterator<SwTxtFrm,SwTxtNode> aIter( *this ); + for( SwTxtFrm* pLastFrm = aIter.First(); pLastFrm; pLastFrm = aIter.Next() ) { // Only (master-) text frames can have a drop cap. - if ( pLastFrm->ISA( SwTxtFrm ) && !((SwTxtFrm*)pLastFrm)->IsFollow() ) + if ( !pLastFrm->IsFollow() ) { - if( !((SwTxtFrm*)pLastFrm)->HasPara() ) - ((SwTxtFrm*)pLastFrm)->GetFormatted(); + if( !pLastFrm->HasPara() ) + pLastFrm->GetFormatted(); - if ( !((SwTxtFrm*)pLastFrm)->IsEmpty() ) + if ( !pLastFrm->IsEmpty() ) { - const SwParaPortion* pPara = ((SwTxtFrm*)pLastFrm)->GetPara(); + const SwParaPortion* pPara = pLastFrm->GetPara(); OSL_ENSURE( pPara, "GetDropSize could not find the ParaPortion, I'll guess the drop cap size" ); if ( pPara ) @@ -264,7 +263,6 @@ bool SwTxtNode::GetDropSize(int& rFontHeight, int& rDropHeight, int& rDropDescen } break; } - pLastFrm = ++aClientIter; } if (rFontHeight==0 && rDropHeight==0 && rDropDescent==0) diff --git a/sw/source/core/text/txtfld.cxx b/sw/source/core/text/txtfld.cxx index f99a2e334387..de1526462065 100644 --- a/sw/source/core/text/txtfld.cxx +++ b/sw/source/core/text/txtfld.cxx @@ -170,7 +170,7 @@ SwExpandPortion *SwTxtFormatter::NewFldPortion( SwTxtFormatInfo &rInf, case RES_PAGENUMBERFLD: { - if( !bName && pSh && !pSh->Imp()->IsUpdateExpFlds() ) + if( !bName && pSh && pSh->GetLayout() && !pSh->Imp()->IsUpdateExpFlds() )//swmod 080122 { SwPageNumberFieldType *pPageNr = (SwPageNumberFieldType *)pFld->GetTyp(); diff --git a/sw/source/core/text/txtfly.cxx b/sw/source/core/text/txtfly.cxx index b8b8476e4553..0443b23d7cf6 100644 --- a/sw/source/core/text/txtfly.cxx +++ b/sw/source/core/text/txtfly.cxx @@ -78,6 +78,7 @@ #if OSL_DEBUG_LEVEL > 1 #include "viewopt.hxx" // SwViewOptions, nur zum Testen (Test2) +#include "doc.hxx" #endif @@ -955,7 +956,7 @@ sal_Bool SwTxtFly::DrawTextOpaque( SwDrawTextInfo &rInf ) if ( bOn && nCount > 0 ) // <-- { - MSHORT nHellId = pPage->GetShell()->getIDocumentDrawModelAccess()->GetHellId(); + MSHORT nHellId = pPage->getRootFrm()->GetCurrShell()->getIDocumentDrawModelAccess()->GetHellId(); for( MSHORT i = 0; i < nCount; ++i ) { // --> OD 2006-08-15 #i68520# @@ -1060,7 +1061,7 @@ void SwTxtFly::DrawFlyRect( OutputDevice* pOut, const SwRect &rRect, if ( bOn && nCount > 0 ) // <-- { - MSHORT nHellId = pPage->GetShell()->getIDocumentDrawModelAccess()->GetHellId(); + MSHORT nHellId = pPage->getRootFrm()->GetCurrShell()->getIDocumentDrawModelAccess()->GetHellId(); for( MSHORT i = 0; i < nCount; ++i ) { // --> OD 2006-08-15 #i68520# @@ -1099,7 +1100,7 @@ void SwTxtFly::DrawFlyRect( OutputDevice* pOut, const SwRect &rRect, SwRect aFly( pAnchoredObjTmp->GetObjRect() ); // <-- // OD 24.01.2003 #106593# - ::SwAlignRect( aFly, pPage->GetShell() ); + ::SwAlignRect( aFly, pPage->getRootFrm()->GetCurrShell() ); if( aFly.Width() > 0 && aFly.Height() > 0 ) aRegion -= aFly; } @@ -1797,11 +1798,11 @@ const SwRect SwContourCache::ContourRect( const SwFmt* pFmt, delete pPolyPolygon; // UPPER_LOWER_TEST #if OSL_DEBUG_LEVEL > 1 - const SwRootFrm* pTmpRootFrm = pFmt->getIDocumentLayoutAccess()->GetRootFrm(); - if( pTmpRootFrm->GetCurrShell() ) + const ViewShell* pTmpViewShell = pFmt->GetDoc()->GetCurrentViewShell(); + if( pTmpViewShell ) { - sal_Bool bT2 = pTmpRootFrm->GetCurrShell()->GetViewOptions()->IsTest2(); - sal_Bool bT6 = pTmpRootFrm->GetCurrShell()->GetViewOptions()->IsTest6(); + sal_Bool bT2 = pTmpViewShell->GetViewOptions()->IsTest2(); + sal_Bool bT6 = pTmpViewShell->GetViewOptions()->IsTest6(); if( bT2 || bT6 ) { if( bT2 ) diff --git a/sw/source/core/text/txtfrm.cxx b/sw/source/core/text/txtfrm.cxx index 0b90971528e9..8e1114ba5853 100644 --- a/sw/source/core/text/txtfrm.cxx +++ b/sw/source/core/text/txtfrm.cxx @@ -42,6 +42,7 @@ #include <swmodule.hxx> #include <SwSmartTagMgr.hxx> #include <doc.hxx> // GetDoc() +#include "rootfrm.hxx" #include <pagefrm.hxx> // InvalidateSpelling #include <rootfrm.hxx> #include <viewsh.hxx> // ViewShell @@ -73,19 +74,16 @@ #include <SwGrammarMarkUp.hxx> #include <lineinfo.hxx> #include <SwPortionHandler.hxx> -// OD 2004-01-15 #110582# #include <dcontact.hxx> -// OD 2004-05-24 #i28701# #include <sortedobjs.hxx> -// --> OD 2005-03-30 #???# #include <txtflcnt.hxx> // SwTxtFlyCnt #include <fmtflcnt.hxx> // SwFmtFlyCnt #include <fmtcntnt.hxx> // SwFmtCntnt -// <-- #include <numrule.hxx> #include <swtable.hxx> #include <fldupde.hxx> #include <IGrammarContact.hxx> +#include <switerator.hxx> #if OSL_DEBUG_LEVEL > 1 #include <txtpaint.hxx> // DbgRect @@ -394,8 +392,8 @@ void SwTxtFrm::InitCtor() /************************************************************************* * SwTxtFrm::SwTxtFrm() *************************************************************************/ -SwTxtFrm::SwTxtFrm(SwTxtNode * const pNode) - : SwCntntFrm(pNode) +SwTxtFrm::SwTxtFrm(SwTxtNode * const pNode, SwFrm* pSib ) + : SwCntntFrm( pNode, pSib ) { InitCtor(); } @@ -440,7 +438,7 @@ sal_Bool SwTxtFrm::IsHiddenNow() const const bool bHiddenCharsHidePara = GetTxtNode()->HasHiddenCharAttribute( true ); const bool bHiddenParaField = GetTxtNode()->HasHiddenParaField(); - const ViewShell* pVsh = GetShell(); + const ViewShell* pVsh = getRootFrm()->GetCurrShell(); if ( pVsh && ( bHiddenCharsHidePara || bHiddenParaField ) ) { @@ -609,7 +607,7 @@ void SwTxtFrm::HideAndShowObjects() // paragraph is visible, but can contain hidden text portion. // first we check if objects are allowed to be hidden: const SwTxtNode& rNode = *GetTxtNode(); - const ViewShell* pVsh = GetShell(); + const ViewShell* pVsh = getRootFrm()->GetCurrShell(); const bool bShouldBeHidden = !pVsh || !pVsh->GetWin() || !pVsh->GetViewOptions()->IsShowHiddenChar(); @@ -900,7 +898,7 @@ void lcl_SetWrong( SwTxtFrm& rFrm, xub_StrLen nPos, long nCnt, bool bMove ) pTxtNode->SetSmartTagDirty( true ); } - SwRootFrm *pRootFrm = rFrm.FindRootFrm(); + SwRootFrm *pRootFrm = rFrm.getRootFrm(); if (pRootFrm) { pRootFrm->SetNeedGrammarCheck( sal_True ); @@ -944,7 +942,7 @@ void lcl_ModifyOfst( SwTxtFrm* pFrm, xub_StrLen nPos, xub_StrLen nLen ) * SwTxtFrm::Modify() *************************************************************************/ -void SwTxtFrm::Modify( SfxPoolItem *pOld, SfxPoolItem *pNew ) +void SwTxtFrm::Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew ) { const MSHORT nWhich = pOld ? pOld->Which() : pNew ? pNew->Which() : 0; @@ -953,7 +951,7 @@ void SwTxtFrm::Modify( SfxPoolItem *pOld, SfxPoolItem *pNew ) if( IsInRange( aFrmFmtSetRange, nWhich ) || RES_FMT_CHG == nWhich ) { SwCntntFrm::Modify( pOld, pNew ); - if( nWhich == RES_FMT_CHG && GetShell() ) + if( nWhich == RES_FMT_CHG && getRootFrm()->GetCurrShell() ) { // Collection hat sich geaendert Prepare( PREP_CLEAR ); @@ -1068,9 +1066,10 @@ void SwTxtFrm::Modify( SfxPoolItem *pOld, SfxPoolItem *pNew ) } // --> OD 2010-02-16 #i104008# - if ( GetShell() ) + ViewShell* pViewSh = getRootFrm() ? getRootFrm()->GetCurrShell() : 0; + if ( pViewSh ) { - GetShell()->InvalidateAccessibleParaAttrs( *this ); + pViewSh->InvalidateAccessibleParaAttrs( *this ); } // <-- } @@ -1278,7 +1277,7 @@ void SwTxtFrm::Modify( SfxPoolItem *pOld, SfxPoolItem *pNew ) if( nCount ) { - if( GetShell() ) + if( getRootFrm()->GetCurrShell() ) { Prepare( PREP_CLEAR ); _InvalidatePrt(); @@ -1324,9 +1323,10 @@ void SwTxtFrm::Modify( SfxPoolItem *pOld, SfxPoolItem *pNew ) } // --> OD 2009-01-06 #i88069# - if ( GetShell() ) + ViewShell* pViewSh = getRootFrm() ? getRootFrm()->GetCurrShell() : 0; + if ( pViewSh ) { - GetShell()->InvalidateAccessibleParaAttrs( *this ); + pViewSh->InvalidateAccessibleParaAttrs( *this ); } // <-- } @@ -2307,7 +2307,7 @@ void SwTxtFrm::_CalcHeightOfLastLine( const bool _bUseFont ) const SwTwips mnOldHeightOfLastLine( mnHeightOfLastLine ); // <-- // determine output device - ViewShell* pVsh = GetShell(); + ViewShell* pVsh = getRootFrm()->GetCurrShell(); OSL_ENSURE( pVsh, "<SwTxtFrm::_GetHeightOfLastLineForPropLineSpacing()> - no ViewShell" ); // --> OD 2007-07-02 #i78921# - make code robust, according to provided patch // There could be no <ViewShell> instance in the case of loading a binary @@ -2318,7 +2318,7 @@ void SwTxtFrm::_CalcHeightOfLastLine( const bool _bUseFont ) } OutputDevice* pOut = pVsh->GetOut(); const IDocumentSettingAccess* pIDSA = GetTxtNode()->getIDocumentSettingAccess(); - if ( !pIDSA->get(IDocumentSettingAccess::BROWSE_MODE) || + if ( !pVsh->GetViewOptions()->getBrowseMode() || pVsh->GetViewOptions()->IsPrtFormat() ) { pOut = GetTxtNode()->getIDocumentDeviceAccess()->getReferenceDevice( true ); @@ -2796,4 +2796,18 @@ void SwTxtFrm::CalcBaseOfstForFly() mnFlyAnchorOfstNoWrap = nRet2 - nLeft; } -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ +/* repaint all text frames of the given text node */ +void SwTxtFrm::repaintTextFrames( const SwTxtNode& rNode ) +{ + SwIterator<SwTxtFrm,SwTxtNode> aIter( rNode ); + for( const SwTxtFrm *pFrm = aIter.First(); pFrm; pFrm = aIter.Next() ) + { + SwRect aRec( pFrm->PaintArea() ); + const SwRootFrm *pRootFrm = pFrm->getRootFrm(); + ViewShell *pCurShell = pRootFrm ? pRootFrm->GetCurrShell() : NULL; + if( pCurShell ) + pCurShell->InvalidateWindows( aRec ); + } +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
\ No newline at end of file diff --git a/sw/source/core/text/txtftn.cxx b/sw/source/core/text/txtftn.cxx index 5f474354be45..8ad815c94612 100644 --- a/sw/source/core/text/txtftn.cxx +++ b/sw/source/core/text/txtftn.cxx @@ -31,6 +31,7 @@ #include "viewsh.hxx" #include "doc.hxx" #include "pagefrm.hxx" +#include "rootfrm.hxx" #include "ndtxt.hxx" #include "txtatr.hxx" #include <SwPortionHandler.hxx> @@ -690,7 +691,7 @@ void SwTxtFrm::ConnectFtn( SwTxtFtn *pFtn, const SwTwips nDeadLine ) { if( !pSrcFrm ) { - SwFtnFrm *pNew = new SwFtnFrm(pDoc->GetDfltFrmFmt(),this,pFtn); + SwFtnFrm *pNew = new SwFtnFrm(pDoc->GetDfltFrmFmt(),this,this,pFtn); SwNodeIndex aIdx( *pFtn->GetStartNode(), 1 ); ::_InsertCnt( pNew, pDoc, aIdx.GetIndex() ); GetNode()->getIDocumentLayoutAccess()->GetLayouter()->CollectEndnote( pNew ); @@ -755,7 +756,7 @@ void SwTxtFrm::ConnectFtn( SwTxtFtn *pFtn, const SwTwips nDeadLine ) pBoss->RearrangeFtns( nDeadLine, sal_False, pFtn ); ValidateBodyFrm(); ValidateFrm(); - ViewShell *pSh = GetShell(); + ViewShell *pSh = getRootFrm()->GetCurrShell(); if ( pSh && nHeight == (pCont->Frm().*fnRect->fnGetHeight)() ) //Damit uns nix durch die Lappen geht. pSh->InvalidateWindows( pCont->Frm() ); diff --git a/sw/source/core/text/txtio.cxx b/sw/source/core/text/txtio.cxx index b6cf8144cfa3..d2be2ed2f7a9 100644 --- a/sw/source/core/text/txtio.cxx +++ b/sw/source/core/text/txtio.cxx @@ -35,6 +35,7 @@ #include "viewopt.hxx" // IsDbg() #include "txtatr.hxx" #include "txtfrm.hxx" // IsDbg() +#include "rootfrm.hxx" #include "flyfrms.hxx" #include "inftxt.hxx" #include "porexp.hxx" @@ -69,14 +70,9 @@ SvStream &operator<<( SvStream &rOs, const SwpHints & ) //$ ostream sal_Bool IsDbg( const SwTxtFrm *pFrm ) { -// Hmm, so IsTest4 etc are defined only if OSL_DEBUG_LEVEL > 1, -// but this file is compiled if DBG_UTIL is defined. So should the IsTest4 etc -// then instead be conditional on DBG_UTIL? Such crack. -#if OSL_DEBUG_LEVEL > 1 - if( pFrm && pFrm->GetShell() ) - return pFrm->GetShell()->GetViewOptions()->IsTest4(); + if( pFrm && pFrm->getRootFrm()->GetCurrShell() ) + return pFrm->getRootFrm()->GetCurrShell()->GetViewOptions()->IsTest4(); else -#endif return sal_False; } diff --git a/sw/source/core/text/txttab.cxx b/sw/source/core/text/txttab.cxx index d1091eaf9c86..6d74f36eeaa6 100644 --- a/sw/source/core/text/txttab.cxx +++ b/sw/source/core/text/txttab.cxx @@ -82,7 +82,6 @@ sal_uInt16 SwLineInfo::NumberOfTabStops() const /************************************************************************* * SwTxtFormatter::NewTabPortion() *************************************************************************/ - SwTabPortion *SwTxtFormatter::NewTabPortion( SwTxtFormatInfo &rInf, bool bAuto ) const { SwTabPortion *pTabPor = 0; @@ -214,61 +213,73 @@ SwTabPortion *SwTxtFormatter::NewTabPortion( SwTxtFormatInfo &rInf, bool bAuto ) cFill = 0; eAdj = SVX_TAB_ADJUST_LEFT; } - long nForced = 0; - if ( !bTabsRelativeToIndent ) + + // #i115705# - correction and refactoring: + // overrule determined next tab stop position in order to apply + // a tab stop at the left margin under the following conditions: + // - the new tab portion is inside the hanging indent + // - a tab stop at the left margin is allowed + // - the determined next tab stop is a default tab stop position OR + // the determined next tab stop is beyond the left margin { - if ( bRTL ) + long nLeftMarginTabPos = 0; { - Point aPoint( Left(), 0 ); - pFrm->SwitchLTRtoRTL( aPoint ); - nForced = pFrm->Frm().Right() - aPoint.X(); + if ( !bTabsRelativeToIndent ) + { + if ( bRTL ) + { + Point aPoint( Left(), 0 ); + pFrm->SwitchLTRtoRTL( aPoint ); + nLeftMarginTabPos = pFrm->Frm().Right() - aPoint.X(); + } + else + { + nLeftMarginTabPos = Left() - pFrm->Frm().Left(); + } + } + if( pCurr->HasForcedLeftMargin() ) + { + SwLinePortion* pPor = pCurr->GetPortion(); + while( pPor && !pPor->IsFlyPortion() ) + { + pPor = pPor->GetPortion(); + } + if ( pPor ) + { + nLeftMarginTabPos += pPor->Width(); + } + } } - else + const bool bNewTabPortionInsideHangingIndent = + bRTL ? nCurrentAbsPos > nTabLeft - nLeftMarginTabPos + : nCurrentAbsPos < nTabLeft + nLeftMarginTabPos; + if ( bNewTabPortionInsideHangingIndent ) { - nForced = Left() - pFrm->Frm().Left(); + // If the paragraph is not inside a list having a list tab stop following + // the list label or no further tab stop found in such a paragraph or + // the next tab stop position does not equal the list tab stop, + // a tab stop at the left margin can be applied. If this condition is + // not hold, it is overruled by compatibility option TAB_AT_LEFT_INDENT_FOR_PARA_IN_LIST. + const bool bTabAtLeftMarginAllowed = + ( !aLineInf.IsListTabStopIncluded() || + !pTabStop || + nNextPos != aLineInf.GetListTabStopPosition() ) || + // compatibility option TAB_AT_LEFT_INDENT_FOR_PARA_IN_LIST: + pFrm->GetTxtNode()->getIDocumentSettingAccess()-> + get(IDocumentSettingAccess::TAB_AT_LEFT_INDENT_FOR_PARA_IN_LIST); + if ( bTabAtLeftMarginAllowed ) + { + if ( !pTabStop || eAdj == SVX_TAB_ADJUST_DEFAULT || + ( nNextPos > nLeftMarginTabPos ) ) + { + eAdj = SVX_TAB_ADJUST_DEFAULT; + cFill = 0; + nNextPos = nLeftMarginTabPos; + } + } } } - if( pCurr->HasForcedLeftMargin() ) - { - SwLinePortion* pPor = pCurr->GetPortion(); - while( pPor && !pPor->IsFlyPortion() ) - pPor = pPor->GetPortion(); - if( pPor ) - nForced += pPor->Width(); - } - // --> OD 2009-04-03 #i100732# - // correction of condition, when a tab stop at the left margin can - // be applied: - // If the paragraph is not inside a list having a list tab stop following - // the list label or no further tab stop found in such a paragraph or - // the next tab stop position does not equal the list tab stop, - // a tab stop at the left margin can be applied. If this condition is - // not hold, it is overruled by compatibility option TAB_AT_LEFT_INDENT_FOR_PARA_IN_LIST. - const bool bTabAtLeftMargin = - ( !aLineInf.IsListTabStopIncluded() || - !pTabStop || - nNextPos != aLineInf.GetListTabStopPosition() ) || - // compatibility option TAB_AT_LEFT_INDENT_FOR_PARA_IN_LIST: - pFrm->GetTxtNode()->getIDocumentSettingAccess()-> - get(IDocumentSettingAccess::TAB_AT_LEFT_INDENT_FOR_PARA_IN_LIST); - if ( bTabAtLeftMargin && - // <-- - ( ( bRTL && nCurrentAbsPos > nTabLeft - nForced ) || - ( !bRTL && nCurrentAbsPos < nTabLeft + nForced ) ) && - // --> OD 2009-07-21 #i103685# - // adjust condition: - // - back to pre OOo 3.0 condition, if tab stops are relative to indent - // - further checks needed, if tab stops are not relative to indent - ( nNextPos > 0 && - ( bTabsRelativeToIndent || - ( !pTabStop || nNextPos > nForced ) ) ) ) - // <-- - { - eAdj = SVX_TAB_ADJUST_DEFAULT; - cFill = 0; - nNextPos = nForced; - } nNextPos += bRTL ? nLinePos - nTabLeft : nTabLeft - nLinePos; OSL_ENSURE( nNextPos >= 0, "GetTabStop: Don't go back!" ); nNewTabPos = KSHORT(nNextPos); diff --git a/sw/source/core/tox/tox.cxx b/sw/source/core/tox/tox.cxx index 2ab959490252..3ae878c5a2c2 100644 --- a/sw/source/core/tox/tox.cxx +++ b/sw/source/core/tox/tox.cxx @@ -29,9 +29,6 @@ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_sw.hxx" - - - #include <tools/resid.hxx> #include <hintids.hxx> #include <swtypes.hxx> @@ -46,13 +43,11 @@ #include <editeng/tstpitem.hxx> #include <SwStyleNameMapper.hxx> #include <hints.hxx> // SwPtrMsgPoolItem - -// -> #i21237# #include <algorithm> #include <functional> +#include <switerator.hxx> using namespace std; -// <- #i21237# const sal_Char* SwForm::aFormEntry = "<E>"; const sal_Char* SwForm::aFormTab = "<T>"; @@ -122,11 +117,9 @@ const PatternIni aPatternIni[] = {USHRT_MAX, USHRT_MAX, USHRT_MAX, USHRT_MAX, USHRT_MAX} }; -// -> #i21237# SwFormTokens lcl_GetAuthPattern(sal_uInt16 nTypeId) { - SwFormTokens aRet; // #i21237# - + SwFormTokens aRet; PatternIni aIni = aPatternIni[nTypeId]; sal_uInt16 nVals[5]; @@ -192,7 +185,7 @@ SwTOXMark::SwTOXMark( const SwTOXType* pTyp ) SwTOXMark::SwTOXMark( const SwTOXMark& rCopy ) : SfxPoolItem( RES_TXTATR_TOXMARK ) - , SwModify(rCopy.pRegisteredIn) + , SwModify(rCopy.GetRegisteredInNonConst()) , aPrimaryKey( rCopy.aPrimaryKey ), aSecondaryKey( rCopy.aSecondaryKey ), aTextReading( rCopy.aTextReading ), @@ -212,6 +205,11 @@ SwTOXMark::~SwTOXMark() } +void SwTOXMark::RegisterToTOXType( SwTOXType& rMark ) +{ + rMark.Add(this); +} + int SwTOXMark::operator==( const SfxPoolItem& rAttr ) const { OSL_ENSURE( SfxPoolItem::operator==( rAttr ), "keine gleichen Attribute" ); @@ -224,9 +222,9 @@ SfxPoolItem* SwTOXMark::Clone( SfxItemPool* ) const return new SwTOXMark( *this ); } -void SwTOXMark::Modify(SfxPoolItem* pOld, SfxPoolItem* pNew) +void SwTOXMark::Modify( const SfxPoolItem* pOld, const SfxPoolItem* pNew) { - SwModify::Modify(pOld, pNew); + NotifyClients(pOld, pNew); if (pOld && (RES_REMOVE_UNO_OBJECT == pOld->Which())) { // invalidate cached uno object SetXTOXMark(::com::sun::star::uno::Reference< @@ -238,7 +236,7 @@ void SwTOXMark::InvalidateTOXMark() { SwPtrMsgPoolItem aMsgHint( RES_REMOVE_UNO_OBJECT, &static_cast<SwModify&>(*this) ); // cast to base class! - Modify(&aMsgHint, &aMsgHint); + NotifyClients(&aMsgHint, &aMsgHint); } String SwTOXMark::GetText() const @@ -259,6 +257,18 @@ String SwTOXMark::GetText() const return aStr; } +void SwTOXMark::InsertTOXMarks( SwTOXMarks& aMarks, const SwTOXType& rType ) +{ + SwIterator<SwTOXMark,SwTOXType> aIter(rType); + SwTOXMark* pMark = aIter.First(); + while( pMark ) + { + if(pMark->GetTxtTOXMark()) + aMarks.C40_INSERT(SwTOXMark, pMark, aMarks.Count()); + pMark = aIter.Next(); + } +} + /*-------------------------------------------------------------------- Beschreibung: Typen von Verzeichnissen verwalten --------------------------------------------------------------------*/ @@ -521,11 +531,16 @@ SwTOXBase::SwTOXBase(const SwTOXType* pTyp, const SwForm& rForm, SwTOXBase::SwTOXBase( const SwTOXBase& rSource, SwDoc* pDoc ) - : SwClient( rSource.pRegisteredIn ) + : SwClient( rSource.GetRegisteredInNonConst() ) { CopyTOXBase( pDoc, rSource ); } +void SwTOXBase::RegisterToTOXType( SwTOXType& rType ) +{ + rType.Add( this ); +} + SwTOXBase& SwTOXBase::CopyTOXBase( SwDoc* pDoc, const SwTOXBase& rSource ) { SwTOXType* pType = (SwTOXType*)rSource.GetTOXType(); diff --git a/sw/source/core/tox/txmsrt.cxx b/sw/source/core/tox/txmsrt.cxx index 7ca2ae0adbc0..ee3d247db41f 100644 --- a/sw/source/core/tox/txmsrt.cxx +++ b/sw/source/core/tox/txmsrt.cxx @@ -181,7 +181,7 @@ SwTOXSortTabBase::SwTOXSortTabBase( TOXSortType nTyp, const SwCntntNode* pNd, { // dann die "Anker" (Body) Position holen. Point aPt; - const SwCntntFrm* pFrm = pNd->GetFrm( &aPt, 0, sal_False ); + const SwCntntFrm* pFrm = pNd->getLayoutFrm( pNd->GetDoc()->GetCurrentLayout(), &aPt, 0, sal_False ); if( pFrm ) { SwPosition aPos( *pNd ); diff --git a/sw/source/core/txtnode/SwGrammarContact.cxx b/sw/source/core/txtnode/SwGrammarContact.cxx index a9ee7f529cdb..14ff4233246f 100644 --- a/sw/source/core/txtnode/SwGrammarContact.cxx +++ b/sw/source/core/txtnode/SwGrammarContact.cxx @@ -39,9 +39,6 @@ #include <rootfrm.hxx> #include <viewsh.hxx> -extern void repaintTextFrames( SwModify& rModify ); - - /* SwGrammarContact This class is responsible for the delayed display of grammar checks when a paragraph is edited It's a client of the paragraph the cursor points to. @@ -59,7 +56,7 @@ class SwGrammarContact : public IGrammarContact, public SwClient Timer aTimer; SwGrammarMarkUp *mpProxyList; bool mbFinished; - SwTxtNode* getMyTxtNode() { return (SwTxtNode*)pRegisteredIn; } + SwTxtNode* getMyTxtNode() { return (SwTxtNode*)GetRegisteredIn(); } DECL_LINK( TimerRepaint, Timer * ); public: @@ -70,9 +67,9 @@ public: virtual void updateCursorPosition( const SwPosition& rNewPos ); virtual SwGrammarMarkUp* getGrammarCheck( SwTxtNode& rTxtNode, bool bCreate ); virtual void finishGrammarCheck( SwTxtNode& rTxtNode ); - +protected: // virtual function of SwClient - virtual void Modify( SfxPoolItem *pOld, SfxPoolItem *pNew); + virtual void Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew); }; SwGrammarContact::SwGrammarContact() : mpProxyList(0), mbFinished( false ) @@ -86,11 +83,11 @@ IMPL_LINK( SwGrammarContact, TimerRepaint, Timer *, pTimer ) if( pTimer ) { pTimer->Stop(); - if( pRegisteredIn ) + if( GetRegisteredIn() ) { //Replace the old wrong list by the proxy list and repaint all frames getMyTxtNode()->SetGrammarCheck( mpProxyList, true ); mpProxyList = 0; - repaintTextFrames( *pRegisteredIn ); + SwTxtFrm::repaintTextFrames( *getMyTxtNode() ); } } return 0; @@ -108,9 +105,9 @@ void SwGrammarContact::updateCursorPosition( const SwPosition& rNewPos ) if( mpProxyList ) { // replace old list by the proxy list and repaint getMyTxtNode()->SetGrammarCheck( mpProxyList, true ); - repaintTextFrames( *pRegisteredIn ); + SwTxtFrm::repaintTextFrames( *getMyTxtNode() ); } - pRegisteredIn->Remove( this ); // good bye old paragraph + GetRegisteredInNonConst()->Remove( this ); // good bye old paragraph mpProxyList = 0; } if( pTxtNode ) @@ -159,16 +156,16 @@ SwGrammarMarkUp* SwGrammarContact::getGrammarCheck( SwTxtNode& rTxtNode, bool bC return pRet; } -void SwGrammarContact::Modify( SfxPoolItem *pOld, SfxPoolItem * ) +void SwGrammarContact::Modify( const SfxPoolItem* pOld, const SfxPoolItem * ) { if( !pOld || pOld->Which() != RES_OBJECTDYING ) return; SwPtrMsgPoolItem *pDead = (SwPtrMsgPoolItem *)pOld; - if( pDead->pObject == pRegisteredIn ) + if( pDead->pObject == GetRegisteredIn() ) { // if my current paragraph dies, I throw the proxy list away aTimer.Stop(); - pRegisteredIn->Remove( this ); + GetRegisteredInNonConst()->Remove( this ); delete mpProxyList; mpProxyList = 0; } @@ -176,8 +173,8 @@ void SwGrammarContact::Modify( SfxPoolItem *pOld, SfxPoolItem * ) void SwGrammarContact::finishGrammarCheck( SwTxtNode& rTxtNode ) { - if( &rTxtNode != pRegisteredIn ) // not my paragraph - repaintTextFrames( rTxtNode ); // can be repainted directly + if( &rTxtNode != GetRegisteredIn() ) // not my paragraph + SwTxtFrm::repaintTextFrames( rTxtNode ); // can be repainted directly else { if( mpProxyList ) @@ -188,7 +185,7 @@ void SwGrammarContact::finishGrammarCheck( SwTxtNode& rTxtNode ) else if( getMyTxtNode()->GetGrammarCheck() ) { // all grammar problems seems to be gone, no delay needed getMyTxtNode()->SetGrammarCheck( 0, true ); - repaintTextFrames( *pRegisteredIn ); + SwTxtFrm::repaintTextFrames( *getMyTxtNode() ); } } } @@ -198,21 +195,6 @@ IGrammarContact* createGrammarContact() return new SwGrammarContact(); } -/* repaint all text frames of the given text node */ -void repaintTextFrames( SwModify& rModify ) -{ - SwClientIter aIter( rModify ); - for( const SwTxtFrm *pFrm = (const SwTxtFrm*)aIter.First( TYPE(SwTxtFrm) ); - pFrm; pFrm = (const SwTxtFrm*)aIter.Next() ) - { - SwRect aRec( pFrm->PaintArea() ); - const SwRootFrm *pRootFrm = pFrm->FindRootFrm(); - ViewShell *pCurShell = pRootFrm ? pRootFrm->GetCurrShell() : NULL; - if( pCurShell ) - pCurShell->InvalidateWindows( aRec ); - } -} - void finishGrammarCheck( SwTxtNode& rTxtNode ) { IGrammarContact* pGrammarContact = getGrammarContact( rTxtNode ); diff --git a/sw/source/core/txtnode/atrfld.cxx b/sw/source/core/txtnode/atrfld.cxx index 20d739bfc8b3..4f6488e570ea 100644 --- a/sw/source/core/txtnode/atrfld.cxx +++ b/sw/source/core/txtnode/atrfld.cxx @@ -44,7 +44,7 @@ #include "calc.hxx" // Update fuer UserFields #include "hints.hxx" #include <IDocumentFieldsAccess.hxx> - +#include <fieldhint.hxx> #include <svl/smplhint.hxx> TYPEINIT3( SwFmtFld, SfxPoolItem, SwClient,SfxBroadcaster) @@ -127,6 +127,12 @@ SwFmtFld::~SwFmtFld() } } +void SwFmtFld::RegisterToFieldType( SwFieldType& rType ) +{ + rType.Add(this); +} + + // #111840# void SwFmtFld::SetFld(SwField * _pField) { @@ -154,7 +160,30 @@ SfxPoolItem* SwFmtFld::Clone( SfxItemPool* ) const return new SwFmtFld( *this ); } -void SwFmtFld::Modify( SfxPoolItem* pOld, SfxPoolItem* pNew ) +void SwFmtFld::SwClientNotify( const SwModify&, const SfxHint& rHint ) +{ + if( !pTxtAttr ) + return; + + const SwFieldHint* pHint = dynamic_cast<const SwFieldHint*>( &rHint ); + if ( pHint ) + { + // replace field content by text + SwPaM* pPaM = pHint->GetPaM(); + SwDoc* pDoc = pPaM->GetDoc(); + const SwTxtNode& rTxtNode = pTxtAttr->GetTxtNode(); + pPaM->GetPoint()->nNode = rTxtNode; + pPaM->GetPoint()->nContent.Assign( (SwTxtNode*)&rTxtNode, *pTxtAttr->GetStart() ); + + String const aEntry( GetFld()->ExpandField( pDoc->IsClipBoard() ) ); + pPaM->SetMark(); + pPaM->Move( fnMoveForward ); + pDoc->DeleteRange( *pPaM ); + pDoc->InsertString( *pPaM, aEntry ); + } +} + +void SwFmtFld::Modify( const SfxPoolItem* pOld, const SfxPoolItem* pNew ) { if( !pTxtAttr ) return; @@ -172,7 +201,7 @@ void SwFmtFld::Modify( SfxPoolItem* pOld, SfxPoolItem* pNew ) case RES_TXTATR_FLDCHG: // "Farbe hat sich geaendert !" // this, this fuer "nur Painten" - pTxtNd->Modify( this, this ); + pTxtNd->ModifyNotification( this, this ); return; case RES_REFMARKFLD_UPDATE: // GetReferenz-Felder aktualisieren @@ -186,12 +215,12 @@ void SwFmtFld::Modify( SfxPoolItem* pOld, SfxPoolItem* pNew ) break; case RES_DOCPOS_UPDATE: // Je nach DocPos aktualisieren (SwTxtFrm::Modify()) - pTxtNd->Modify( pNew, this ); + pTxtNd->ModifyNotification( pNew, this ); return; case RES_ATTRSET_CHG: case RES_FMT_CHG: - pTxtNd->Modify( pOld, pNew ); + pTxtNd->ModifyNotification( pOld, pNew ); return; default: break; @@ -207,7 +236,7 @@ void SwFmtFld::Modify( SfxPoolItem* pOld, SfxPoolItem* pNew ) case RES_DBNUMSETFLD: case RES_DBNEXTSETFLD: case RES_DBNAMEFLD: - pTxtNd->Modify( 0, pNew); + pTxtNd->ModifyNotification( 0, pNew); return; } @@ -311,7 +340,7 @@ void SwTxtFld::Expand() const // aenderung an die Frames posten if( m_pTxtNode->CalcHiddenParaField() ) { - m_pTxtNode->Modify( 0, 0 ); + m_pTxtNode->ModifyNotification( 0, 0 ); } return; } @@ -320,7 +349,7 @@ void SwTxtFld::Expand() const m_aExpand = aNewExpand; // 0, this for formatting - m_pTxtNode->Modify( 0, const_cast<SwFmtFld*>( &GetFld() ) ); + m_pTxtNode->ModifyNotification( 0, const_cast<SwFmtFld*>( &GetFld() ) ); } /************************************************************************* @@ -387,7 +416,7 @@ void SwTxtFld::NotifyContentChange(SwFmtFld& rFmtFld) //if not in undo section notify the change if (m_pTxtNode && m_pTxtNode->GetNodes().IsDocNodes()) { - m_pTxtNode->Modify(0, &rFmtFld); + m_pTxtNode->ModifyNotification(0, &rFmtFld); } } diff --git a/sw/source/core/txtnode/atrflyin.cxx b/sw/source/core/txtnode/atrflyin.cxx index 59295172de57..4a7319993d0a 100644 --- a/sw/source/core/txtnode/atrflyin.cxx +++ b/sw/source/core/txtnode/atrflyin.cxx @@ -43,9 +43,8 @@ #include "swfont.hxx" #include "txtfrm.hxx" #include "flyfrms.hxx" -// --> OD 2004-11-09 #i26945# #include <objectformatter.hxx> -// <-- +#include <switerator.hxx> SwFmtFlyCnt::SwFmtFlyCnt( SwFrmFmt *pFrmFmt ) : SfxPoolItem( RES_TXTATR_FLYCNT ), @@ -233,17 +232,15 @@ SwFlyInCntFrm *SwTxtFlyCnt::_GetFlyFrm( const SwFrm *pCurrFrm ) return NULL; } - SwClientIter aIter( *GetFlyCnt().pFmt ); + SwIterator<SwFlyFrm,SwFmt> aIter( *GetFlyCnt().pFmt ); OSL_ENSURE( pCurrFrm->IsTxtFrm(), "SwTxtFlyCnt::_GetFlyFrm for TxtFrms only." ); - - if( aIter.GoStart() ) + SwFrm* pFrm = aIter.First(); + if ( pFrm ) { SwTxtFrm *pFirst = (SwTxtFrm*)pCurrFrm; while ( pFirst->IsFollow() ) pFirst = pFirst->FindMaster(); do - { SwFrm * pFrm = PTR_CAST( SwFrm, aIter() ); - if ( pFrm ) { SwTxtFrm *pTmp = pFirst; do @@ -258,8 +255,10 @@ SwFlyInCntFrm *SwTxtFlyCnt::_GetFlyFrm( const SwFrm *pCurrFrm ) } pTmp = pTmp->GetFollow(); } while ( pTmp ); - } - } while( aIter++ ); + + pFrm = aIter.Next(); + + } while( pFrm ); } // Wir haben keinen passenden FlyFrm gefunden, deswegen wird ein @@ -267,8 +266,9 @@ SwFlyInCntFrm *SwTxtFlyCnt::_GetFlyFrm( const SwFrm *pCurrFrm ) // Dabei wird eine sofortige Neuformatierung von pCurrFrm angestossen. // Die Rekursion wird durch den Lockmechanismus in SwTxtFrm::Format() // abgewuergt. - SwFlyInCntFrm *pFly = new SwFlyInCntFrm( (SwFlyFrmFmt*)pFrmFmt, (SwFrm*)pCurrFrm ); - ((SwFrm*)pCurrFrm)->AppendFly( pFly ); + SwFrm* pCurrFrame = const_cast< SwFrm* >(pCurrFrm); + SwFlyInCntFrm *pFly = new SwFlyInCntFrm( (SwFlyFrmFmt*)pFrmFmt, pCurrFrame, pCurrFrame ); + pCurrFrame->AppendFly( pFly ); pFly->RegistFlys(); // 7922: Wir muessen dafuer sorgen, dass der Inhalt des FlyInCnt diff --git a/sw/source/core/txtnode/atrftn.cxx b/sw/source/core/txtnode/atrftn.cxx index 3e67e6d759e2..fdea3387ae6a 100644 --- a/sw/source/core/txtnode/atrftn.cxx +++ b/sw/source/core/txtnode/atrftn.cxx @@ -48,6 +48,7 @@ #include <ndindex.hxx> #include <fmtftntx.hxx> #include <section.hxx> +#include <switerator.hxx> /************************************************************************* |* @@ -89,7 +90,7 @@ void SwFmtFtn::SetEndNote( bool b ) { if ( GetTxtFtn() ) { - GetTxtFtn()->DelFrms(); + GetTxtFtn()->DelFrms(0); } m_bEndNote = b; } @@ -235,7 +236,7 @@ void SwTxtFtn::SetStartNode( const SwNodeIndex *pNewNode, sal_Bool bDelNode ) // Werden die Nodes nicht geloescht mussen sie bei den Seiten // abmeldet (Frms loeschen) werden, denn sonst bleiben sie // stehen (Undo loescht sie nicht!) - DelFrms(); + DelFrms( 0 ); } DELETEZ( m_pStartNode ); @@ -269,7 +270,7 @@ void SwTxtFtn::SetNumber( const sal_uInt16 nNewNum, const XubString* pStr ) OSL_ENSURE( m_pTxtNode, "SwTxtFtn: where is my TxtNode?" ); SwNodes &rNodes = m_pTxtNode->GetDoc()->GetNodes(); - m_pTxtNode->Modify( 0, &rFtn ); + m_pTxtNode->ModifyNotification( 0, &rFtn ); if ( m_pStartNode ) { // must iterate over all TxtNodes because of footnotes on other pages @@ -280,7 +281,7 @@ void SwTxtFtn::SetNumber( const sal_uInt16 nNewNum, const XubString* pStr ) { // Es koennen ja auch Grafiken in der Fussnote stehen ... if( ( pNd = rNodes[ nSttIdx ] )->IsTxtNode() ) - ((SwTxtNode*)pNd)->Modify( 0, &rFtn ); + ((SwTxtNode*)pNd)->ModifyNotification( 0, &rFtn ); } } } @@ -359,19 +360,21 @@ void SwTxtFtn::MakeNewTextSection( SwNodes& rNodes ) } -void SwTxtFtn::DelFrms() +void SwTxtFtn::DelFrms( const SwFrm* pSib ) { // delete the FtnFrames from the pages OSL_ENSURE( m_pTxtNode, "SwTxtFtn: where is my TxtNode?" ); if ( !m_pTxtNode ) return; + const SwRootFrm* pRoot = pSib ? pSib->getRootFrm() : 0; sal_Bool bFrmFnd = sal_False; { - SwClientIter aIter( *m_pTxtNode ); - for( SwCntntFrm* pFnd = (SwCntntFrm*)aIter.First( TYPE( SwCntntFrm )); - pFnd; pFnd = (SwCntntFrm*)aIter.Next() ) + SwIterator<SwCntntFrm,SwTxtNode> aIter( *m_pTxtNode ); + for( SwCntntFrm* pFnd = aIter.First(); pFnd; pFnd = aIter.Next() ) { + if( pRoot != pFnd->getRootFrm() && pRoot ) + continue; SwPageFrm* pPage = pFnd->FindPageFrm(); if( pPage ) { @@ -388,10 +391,11 @@ void SwTxtFtn::DelFrms() SwCntntNode* pCNd = m_pTxtNode->GetNodes().GoNext( &aIdx ); if( pCNd ) { - SwClientIter aIter( *pCNd ); - for( SwCntntFrm* pFnd = (SwCntntFrm*)aIter.First( TYPE( SwCntntFrm )); - pFnd; pFnd = (SwCntntFrm*)aIter.Next() ) + SwIterator<SwCntntFrm,SwCntntNode> aIter( *pCNd ); + for( SwCntntFrm* pFnd = aIter.First(); pFnd; pFnd = aIter.Next() ) { + if( pRoot != pFnd->getRootFrm() && pRoot ) + continue; SwPageFrm* pPage = pFnd->FindPageFrm(); SwFrm *pFrm = pFnd->GetUpper(); diff --git a/sw/source/core/txtnode/atrref.cxx b/sw/source/core/txtnode/atrref.cxx index b9c66e4b782f..7adfc3ff591f 100644 --- a/sw/source/core/txtnode/atrref.cxx +++ b/sw/source/core/txtnode/atrref.cxx @@ -78,7 +78,7 @@ SfxPoolItem* SwFmtRefMark::Clone( SfxItemPool* ) const // Attribut fuer Inhalts-/Positions-Referenzen im Text SwTxtRefMark::SwTxtRefMark( SwFmtRefMark& rAttr, - xub_StrLen nStartPos, xub_StrLen* pEnd ) + xub_StrLen const nStartPos, xub_StrLen const*const pEnd) : SwTxtAttrEnd( rAttr, nStartPos, nStartPos ) , m_pTxtNode( 0 ) , m_pEnd( 0 ) diff --git a/sw/source/core/txtnode/atrtox.cxx b/sw/source/core/txtnode/atrtox.cxx index 20d63bc495be..1b3c989e23db 100644 --- a/sw/source/core/txtnode/atrtox.cxx +++ b/sw/source/core/txtnode/atrtox.cxx @@ -37,7 +37,7 @@ #include <ndtxt.hxx> SwTxtTOXMark::SwTxtTOXMark( SwTOXMark& rAttr, - xub_StrLen nStartPos, xub_StrLen* pEnd ) + xub_StrLen const nStartPos, xub_StrLen const*const pEnd) : SwTxtAttrEnd( rAttr, nStartPos, nStartPos ) , m_pTxtNode( 0 ) , m_pEnd( 0 ) diff --git a/sw/source/core/txtnode/fmtatr2.cxx b/sw/source/core/txtnode/fmtatr2.cxx index 660c150eeac2..ed7ab96e35e2 100644 --- a/sw/source/core/txtnode/fmtatr2.cxx +++ b/sw/source/core/txtnode/fmtatr2.cxx @@ -112,10 +112,10 @@ SfxPoolItem* SwFmtCharFmt::Clone( SfxItemPool* ) const // weiterleiten an das TextAttribut -void SwFmtCharFmt::Modify( SfxPoolItem* pOld, SfxPoolItem* pNew ) +void SwFmtCharFmt::Modify( const SfxPoolItem* pOld, const SfxPoolItem* pNew ) { if( pTxtAttr ) - pTxtAttr->Modify( pOld, pNew ); + pTxtAttr->ModifyNotification( pOld, pNew ); } @@ -605,6 +605,7 @@ SwFmtMeta::~SwFmtMeta() { if (m_pMeta && (m_pMeta->GetFmtMeta() == this)) { + NotifyChangeTxtNode(0); m_pMeta->SetFmtMeta(0); } } @@ -632,9 +633,17 @@ void SwFmtMeta::SetTxtAttr(SwTxtMeta * const i_pTxtAttr) m_pTxtAttr = i_pTxtAttr; OSL_ENSURE(m_pMeta, "inserted SwFmtMeta has no sw::Meta?"); // the sw::Meta must be able to find the current text attribute! - if (i_pTxtAttr && m_pMeta) + if (m_pMeta) { - m_pMeta->SetFmtMeta(this); + if (i_pTxtAttr) + { + m_pMeta->SetFmtMeta(this); + } + else if (m_pMeta->GetFmtMeta() == this) + { // text attribute gone => de-register from text node! + NotifyChangeTxtNode(0); + m_pMeta->SetFmtMeta(0); + } } } @@ -642,36 +651,22 @@ void SwFmtMeta::NotifyChangeTxtNode(SwTxtNode *const pTxtNode) { // N.B.: do not reset m_pTxtAttr here: see call in nodes.cxx, // where the hint is not deleted! - OSL_ENSURE(m_pMeta, "NotifyRemoval: no meta ?"); - if (m_pMeta) - { - if (!pTxtNode) - { - SwPtrMsgPoolItem aMsgHint( RES_REMOVE_UNO_OBJECT, - &static_cast<SwModify&>(*m_pMeta) ); // cast to base class! - m_pMeta->Modify(&aMsgHint, &aMsgHint); - } - else - { // do not call Modify, that would call SwXMeta::Modify! - m_pMeta->NotifyChangeTxtNode(); - } + OSL_ENSURE(m_pMeta, "SwFmtMeta::NotifyChangeTxtNode: no Meta?"); + if (m_pMeta && (m_pMeta->GetFmtMeta() == this)) + { // do not call Modify, that would call SwXMeta::Modify! + m_pMeta->NotifyChangeTxtNode(pTxtNode); } } -// UGLY: this really awful method fixes up an inconsistent state, -// and if it is not called when copying, total chaos will undoubtedly ensue -void SwFmtMeta::DoCopy(SwFmtMeta & rOriginalMeta) +// this SwFmtMeta has been cloned and points at the same sw::Meta as the source +// this method copies the sw::Meta +void SwFmtMeta::DoCopy(::sw::MetaFieldManager & i_rTargetDocManager, + SwTxtNode & i_rTargetTxtNode) { OSL_ENSURE(m_pMeta, "DoCopy called for SwFmtMeta with no sw::Meta?"); if (m_pMeta) { const ::boost::shared_ptr< ::sw::Meta> pOriginal( m_pMeta ); - // UGLY: original sw::Meta now points at _this_ due to being already - // inserted via MakeTxtAttr! so fix it up to point at the original item - // (maybe would be better to tell MakeTxtAttr that it creates a copy?) - pOriginal->SetFmtMeta(&rOriginalMeta); - // force pOriginal to register in original text node! - pOriginal->NotifyChangeTxtNode(); if (RES_TXTATR_META == Which()) { m_pMeta.reset( new ::sw::Meta(this) ); @@ -680,14 +675,13 @@ void SwFmtMeta::DoCopy(SwFmtMeta & rOriginalMeta) { ::sw::MetaField *const pMetaField( static_cast< ::sw::MetaField* >(pOriginal.get())); - SwDoc * const pTargetDoc( GetTxtAttr()->GetTxtNode()->GetDoc() ); - m_pMeta = pTargetDoc->GetMetaFieldManager().makeMetaField( this, + m_pMeta = i_rTargetDocManager.makeMetaField( this, pMetaField->m_nNumberFormat, pMetaField->IsFixedLanguage() ); } + // Meta must have a text node before calling RegisterAsCopyOf + m_pMeta->NotifyChangeTxtNode(& i_rTargetTxtNode); // this cannot be done in Clone: a Clone is not necessarily a copy! m_pMeta->RegisterAsCopyOf(*pOriginal); - // force copy Meta to register in target text node! - m_pMeta->NotifyChangeTxtNode(); } } @@ -716,35 +710,44 @@ SwTxtMeta * Meta::GetTxtAttr() const SwTxtNode * Meta::GetTxtNode() const { - SwTxtMeta * const pTxtAttr( GetTxtAttr() ); - return (pTxtAttr) ? pTxtAttr->GetTxtNode() : 0; + return m_pTxtNode; } -void Meta::NotifyChangeTxtNode() +void Meta::NotifyChangeTxtNodeImpl() { - SwTxtNode * const pTxtNode( GetTxtNode() ); - if (pTxtNode && (GetRegisteredIn() != pTxtNode)) + if (m_pTxtNode && (GetRegisteredIn() != m_pTxtNode)) { - pTxtNode->Add(this); + m_pTxtNode->Add(this); } - else if (!pTxtNode && GetRegisteredIn()) + else if (!m_pTxtNode && GetRegisteredIn()) { - const_cast<SwModify *>(GetRegisteredIn())->Remove(this); + GetRegisteredInNonConst()->Remove(this); + } +} + +void Meta::NotifyChangeTxtNode(SwTxtNode *const pTxtNode) +{ + m_pTxtNode = pTxtNode; + NotifyChangeTxtNodeImpl(); + if (!pTxtNode) // text node gone? invalidate UNO object! + { + SwPtrMsgPoolItem aMsgHint( RES_REMOVE_UNO_OBJECT, + &static_cast<SwModify&>(*this) ); // cast to base class! + this->Modify(&aMsgHint, &aMsgHint); } } // SwClient -void Meta::Modify( SfxPoolItem *pOld, SfxPoolItem *pNew ) +void Meta::Modify( const SfxPoolItem *pOld, const SfxPoolItem *pNew ) { - NotifyChangeTxtNode(); - SwModify::Modify(pOld, pNew); + NotifyClients(pOld, pNew); if (pOld && (RES_REMOVE_UNO_OBJECT == pOld->Which())) { // invalidate cached uno object SetXMeta(uno::Reference<rdf::XMetadatable>(0)); } } -// sw::Metadatable +// sfx2::Metadatable ::sfx2::IXmlIdRegistry& Meta::GetRegistry() { SwTxtNode * const pTxtNode( GetTxtNode() ); @@ -898,4 +901,5 @@ MetaFieldManager::getMetaFields() } // namespace sw + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/source/core/txtnode/fntcache.cxx b/sw/source/core/txtnode/fntcache.cxx index 7f051c217c4b..b866f3b4973e 100644 --- a/sw/source/core/txtnode/fntcache.cxx +++ b/sw/source/core/txtnode/fntcache.cxx @@ -394,7 +394,7 @@ sal_uInt16 SwFntObj::GetFontLeading( const ViewShell *pSh, const OutputDevice& r const IDocumentSettingAccess& rIDSA = *pSh->getIDocumentSettingAccess(); const bool bBrowse = ( pSh->GetWin() && - rIDSA.get(IDocumentSettingAccess::BROWSE_MODE) && + pSh->GetViewOptions()->getBrowseMode() && !pSh->GetViewOptions()->IsPrtFormat() ); if ( !bBrowse && rIDSA.get(IDocumentSettingAccess::ADD_EXT_LEADING) ) @@ -433,7 +433,7 @@ void SwFntObj::CreateScrFont( const ViewShell& rSh, const OutputDevice& rOut ) OutputDevice* pPrt = &rSh.GetRefDev(); if( !rSh.GetWin() || - !rSh.getIDocumentSettingAccess()->get(IDocumentSettingAccess::BROWSE_MODE) || + !rSh.GetViewOptions()->getBrowseMode() || rSh.GetViewOptions()->IsPrtFormat() ) { // After CreatePrtFont pPrtFont is the font which is actually used @@ -800,13 +800,12 @@ void SwFntObj::DrawText( SwDrawTextInfo &rInf ) OutputDevice& rRefDev = rInf.GetShell()->GetRefDev(); OutputDevice* pWin = rInf.GetShell()->GetWin(); - const IDocumentSettingAccess* pIDSA = rInf.GetShell()->getIDocumentSettingAccess(); // true if pOut is the printer and the printer has been used for formatting const sal_Bool bPrt = OUTDEV_PRINTER == rInf.GetOut().GetOutDevType() && OUTDEV_PRINTER == rRefDev.GetOutDevType(); const sal_Bool bBrowse = ( pWin && - pIDSA->get(IDocumentSettingAccess::BROWSE_MODE) && + rInf.GetShell()->GetViewOptions()->getBrowseMode() && !rInf.GetShell()->GetViewOptions()->IsPrtFormat() && !rInf.GetBullet() && ( rInf.GetSpace() || !rInf.GetKern() ) && @@ -844,7 +843,7 @@ void SwFntObj::DrawText( SwDrawTextInfo &rInf ) const sal_Bool bNoAdjust = bPrt || ( pWin && - pIDSA->get(IDocumentSettingAccess::BROWSE_MODE) && + rInf.GetShell()->GetViewOptions()->getBrowseMode() && !rInf.GetShell()->GetViewOptions()->IsPrtFormat() ); if ( OUTDEV_PRINTER == rInf.GetOut().GetOutDevType() ) diff --git a/sw/source/core/txtnode/ndtxt.cxx b/sw/source/core/txtnode/ndtxt.cxx index dfa9859c0765..52e99ff519e8 100644 --- a/sw/source/core/txtnode/ndtxt.cxx +++ b/sw/source/core/txtnode/ndtxt.cxx @@ -86,12 +86,13 @@ #include <istyleaccess.hxx> #include <SwStyleNameMapper.hxx> #include <numrule.hxx> - #include <swtable.hxx> #include <docsh.hxx> #include <SwNodeNum.hxx> #include <svl/intitem.hxx> #include <list.hxx> +#include <switerator.hxx> +#include <attrhint.hxx> using namespace ::com::sun::star; @@ -127,16 +128,12 @@ SwTxtNode *SwNodes::MakeTxtNode( const SwNodeIndex & rWhere, // #125329# // call method <UpdateOutlineNode(..)> only for the document nodes array if ( IsDocNodes() ) - { - { - UpdateOutlineNode(*pNode); - } - } + UpdateOutlineNode(*pNode); //Wenn es noch kein Layout gibt oder in einer versteckten Section // stehen, brauchen wir uns um das MakeFrms nicht bemuehen. const SwSectionNode* pSectNd; - if( !GetDoc()->GetRootFrm() || + if( !GetDoc()->GetCurrentViewShell() || //swmod 071108//swmod 071225 ( 0 != (pSectNd = pNode->FindSectionNode()) && pSectNd->GetSection().IsHiddenFlag() )) return pNode; @@ -273,9 +270,9 @@ SwTxtNode::~SwTxtNode() InitSwParaStatistics( false ); } -SwCntntFrm *SwTxtNode::MakeFrm() +SwCntntFrm *SwTxtNode::MakeFrm( SwFrm* pSib ) { - SwCntntFrm *pFrm = new SwTxtFrm(this); + SwCntntFrm *pFrm = new SwTxtFrm( this, pSib ); return pFrm; } @@ -293,7 +290,7 @@ xub_StrLen SwTxtNode::Len() const void lcl_ChangeFtnRef( SwTxtNode &rNode ) { SwpHints *pSwpHints = rNode.GetpSwpHints(); - if( pSwpHints && rNode.GetDoc()->GetRootFrm() ) + if( pSwpHints && rNode.GetDoc()->GetCurrentViewShell() ) //swmod 071108//swmod 071225 { SwTxtAttr* pHt; SwCntntFrm* pFrm = NULL; @@ -308,8 +305,7 @@ void lcl_ChangeFtnRef( SwTxtNode &rNode ) { if( !pFrm ) { - SwClientIter aNew( rNode ); - pFrm = (SwCntntFrm*)aNew.First( TYPE(SwCntntFrm) ); + pFrm = SwIterator<SwCntntFrm,SwTxtNode>::FirstElement( rNode ); if( !pFrm ) return; } @@ -322,11 +318,12 @@ void lcl_ChangeFtnRef( SwTxtNode &rNode ) GetNodes().GoNextSection( &aIdx, sal_True, sal_False ); if ( !pNd ) continue; - SwClientIter aIter( *pNd ); - SwCntntFrm* pCntnt = (SwCntntFrm*)aIter.First(TYPE(SwCntntFrm)); + + SwIterator<SwCntntFrm,SwCntntNode> aIter( *pNd ); + SwCntntFrm* pCntnt = aIter.First(); if( pCntnt ) { - OSL_ENSURE( pCntnt->FindRootFrm() == pFrm->FindRootFrm(), + OSL_ENSURE( pCntnt->getRootFrm() == pFrm->getRootFrm(), "lcl_ChangeFtnRef: Layout double?" ); SwFtnFrm *pFtn = pCntnt->FindFtnFrm(); if( pFtn && pFtn->GetAttr() == pAttr ) @@ -343,7 +340,7 @@ void lcl_ChangeFtnRef( SwTxtNode &rNode ) } } #if OSL_DEBUG_LEVEL > 1 - while( 0 != (pCntnt = (SwCntntFrm*)aIter.Next()) ) + while( 0 != (pCntnt = aIter.Next()) ) { SwFtnFrm *pDbgFtn = pCntnt->FindFtnFrm(); OSL_ENSURE( !pDbgFtn || pDbgFtn->GetRef() == pFrm, @@ -478,21 +475,12 @@ SwCntntNode *SwTxtNode::SplitCntntNode( const SwPosition &rPos ) } - SwClientIter aIter( *this ); - SwClient* pLastFrm = aIter.GoStart(); - if( pLastFrm ) + SwIterator<SwCntntFrm,SwTxtNode> aIter( *this ); + for( SwCntntFrm* pFrm = aIter.First(); pFrm; pFrm = aIter.Next() ) { - do - { SwCntntFrm *pFrm = PTR_CAST( SwCntntFrm, pLastFrm ); - if ( pFrm ) - { - pNode->Add( pFrm ); - if( pFrm->IsTxtFrm() && !pFrm->IsFollow() && - ((SwTxtFrm*)pFrm)->GetOfst() ) - ((SwTxtFrm*)pFrm)->SetOfst( 0 ); - } - pLastFrm = aIter++; - } while ( pLastFrm ); + pFrm->RegisterToNode( *pNode ); + if( pFrm->IsTxtFrm() && !pFrm->IsFollow() && ((SwTxtFrm*)pFrm)->GetOfst() ) + ((SwTxtFrm*)pFrm)->SetOfst( 0 ); } if ( IsInCache() ) @@ -503,24 +491,24 @@ SwCntntNode *SwTxtNode::SplitCntntNode( const SwPosition &rPos ) UnlockModify(); // Benachrichtigungen wieder freischalten - const SwRootFrm * const pRootFrm = pNode->GetDoc()->GetRootFrm(); // If there is an accessible layout we must call modify even // with length zero, because we have to notify about the changed // text node. + const SwRootFrm *pRootFrm; if ( (nTxtLen != nSplitPos) || - ( pRootFrm && pRootFrm->IsAnyShellAccessible() ) ) - + ( (pRootFrm = pNode->GetDoc()->GetCurrentLayout()) != 0 && + pRootFrm->IsAnyShellAccessible() ) ) //swmod 080218 { // dann sage den Frames noch, das am Ende etwas "geloescht" wurde if( 1 == nTxtLen - nSplitPos ) { SwDelChr aHint( nSplitPos ); - pNode->SwModify::Modify( 0, &aHint ); + pNode->NotifyClients( 0, &aHint ); } else { SwDelTxt aHint( nSplitPos, nTxtLen - nSplitPos ); - pNode->SwModify::Modify( 0, &aHint ); + pNode->NotifyClients( 0, &aHint ); } } if ( HasHints() ) @@ -603,7 +591,7 @@ SwCntntNode *SwTxtNode::SplitCntntNode( const SwPosition &rPos ) if( GetDepends() && SFX_ITEM_SET == pNode->GetSwAttrSet(). GetItemState( RES_PAGEDESC, sal_True, &pItem ) ) { - pNode->Modify( (SfxPoolItem*)pItem, (SfxPoolItem*)pItem ); + pNode->ModifyNotification( (SfxPoolItem*)pItem, (SfxPoolItem*)pItem ); } } return pNode; @@ -1389,15 +1377,10 @@ void lcl_CopyHint( const sal_uInt16 nWhich, const SwTxtAttr * const pHt, } case RES_TXTATR_META: case RES_TXTATR_METAFIELD: - OSL_ENSURE(pNewHt, "copying META should not fail! cannot call DoCopy"); + OSL_ENSURE(pNewHt, "copying Meta should not fail!"); OSL_ENSURE(pDest && (CH_TXTATR_INWORD == pDest->GetTxt().GetChar(*pNewHt->GetStart())), "missing CH_TXTATR?"); - if (pNewHt) - { - SwFmtMeta & rMeta(static_cast<SwFmtMeta&>(pNewHt->GetAttr())); - rMeta.DoCopy( const_cast<SwFmtMeta&>(pHt->GetMeta()) ); - } break; } } @@ -1438,7 +1421,8 @@ void SwTxtNode::CopyAttr( SwTxtNode *pDest, const xub_StrLen nTxtStartIdx, { // attribute in the area => copy SwTxtAttr *const pNewHt = pDest->InsertItem( - pHt->GetAttr(), nOldPos, nOldPos ); + pHt->GetAttr(), nOldPos, nOldPos, + nsSetAttrMode::SETATTR_IS_COPY); if ( pNewHt ) { lcl_CopyHint( nWhich, pHt, pNewHt, @@ -1449,7 +1433,8 @@ void SwTxtNode::CopyAttr( SwTxtNode *pDest, const xub_StrLen nTxtStartIdx, : 0 == pOtherDoc->GetRefMark( pHt->GetRefMark().GetRefName() ) ) { - pDest->InsertItem( pHt->GetAttr(), nOldPos, nOldPos ); + pDest->InsertItem( pHt->GetAttr(), nOldPos, nOldPos, + nsSetAttrMode::SETATTR_IS_COPY); } } } @@ -1460,7 +1445,7 @@ void SwTxtNode::CopyAttr( SwTxtNode *pDest, const xub_StrLen nTxtStartIdx, { // Frames benachrichtigen, sonst verschwinden die Ftn-Nummern SwUpdateAttr aHint( nOldPos, nOldPos, 0 ); - pDest->Modify( 0, &aHint ); + pDest->ModifyNotification( 0, &aHint ); } } @@ -1670,9 +1655,9 @@ void SwTxtNode::CopyText( SwTxtNode *const pDest, if( pDest == this ) { - // die Daten kopieren + // copy the hint here, but insert it later pNewHt = MakeTxtAttr( *GetDoc(), pHt->GetAttr(), - nAttrStt, nAttrEnd ); + nAttrStt, nAttrEnd, COPY, pDest ); lcl_CopyHint(nWhich, pHt, pNewHt, 0, pDest); aArr.C40_INSERT( SwTxtAttr, pNewHt, aArr.Count() ); @@ -1680,7 +1665,9 @@ void SwTxtNode::CopyText( SwTxtNode *const pDest, else { pNewHt = pDest->InsertItem( pHt->GetAttr(), nAttrStt - nDeletedDummyChars, - nAttrEnd - nDeletedDummyChars, nsSetAttrMode::SETATTR_NOTXTATRCHR ); + nAttrEnd - nDeletedDummyChars, + nsSetAttrMode::SETATTR_NOTXTATRCHR + | nsSetAttrMode::SETATTR_IS_COPY); if (pNewHt) { lcl_CopyHint( nWhich, pHt, pNewHt, pOtherDoc, pDest ); @@ -1818,7 +1805,7 @@ void SwTxtNode::InsertText( const XubString & rStr, const SwIndex & rIdx, if ( GetDepends() ) { SwInsTxt aHint( aPos, nLen ); - SwModify::Modify( 0, &aHint ); + NotifyClients( 0, &aHint ); } // By inserting a character, the hidden flags @@ -2120,7 +2107,8 @@ void SwTxtNode::CutImpl( SwTxtNode * const pDest, const SwIndex & rDestStart, { const bool bSuccess( pDest->InsertHint( pNewHt, nsSetAttrMode::SETATTR_NOTXTATRCHR - | nsSetAttrMode::SETATTR_DONTREPLACE ) ); + | nsSetAttrMode::SETATTR_DONTREPLACE + | nsSetAttrMode::SETATTR_IS_COPY) ); if (bSuccess) { lcl_CopyHint( nWhich, pHt, pNewHt, pOtherDoc, pDest ); @@ -2172,9 +2160,9 @@ void SwTxtNode::CutImpl( SwTxtNode * const pDest, const SwIndex & rDestStart, // Frames benachrichtigen; SwInsTxt aInsHint( nDestStart, nLen ); - pDest->Modify( 0, &aInsHint ); + pDest->ModifyNotification( 0, &aInsHint ); SwDelTxt aDelHint( nTxtStartIdx, nLen ); - Modify( 0, &aDelHint ); + ModifyNotification( 0, &aDelHint ); } @@ -2264,12 +2252,12 @@ void SwTxtNode::EraseText(const SwIndex &rIdx, const xub_StrLen nCount, if( 1 == nCnt ) { SwDelChr aHint( nStartIdx ); - SwModify::Modify( 0, &aHint ); + NotifyClients( 0, &aHint ); } else { SwDelTxt aHint( nStartIdx, nCnt ); - SwModify::Modify( 0, &aHint ); + NotifyClients( 0, &aHint ); } OSL_ENSURE(rIdx.GetIndex() == nStartIdx, "huh? start index has changed?"); @@ -2326,9 +2314,9 @@ void SwTxtNode::GCAttr() { //TxtFrm's reagieren auf aHint, andere auf aNew SwUpdateAttr aHint( nMin, nMax, 0 ); - SwModify::Modify( 0, &aHint ); + NotifyClients( 0, &aHint ); SwFmtChg aNew( GetTxtColl() ); - SwModify::Modify( 0, &aNew ); + NotifyClients( 0, &aNew ); } } @@ -2403,7 +2391,7 @@ void SwTxtNode::NumRuleChgd() // Important note: { SvxLRSpaceItem& rLR = (SvxLRSpaceItem&)GetSwAttrSet().GetLRSpace(); - SwModify::Modify( &rLR, &rLR ); + NotifyClients( &rLR, &rLR ); } } @@ -3286,10 +3274,10 @@ void SwTxtNode::ReplaceText( const SwIndex& rStart, const xub_StrLen nDelLen, SetIgnoreDontExpand( bOldExpFlg ); SwDelTxt aDelHint( nStartPos, nDelLen ); - SwModify::Modify( 0, &aDelHint ); + NotifyClients( 0, &aDelHint ); SwInsTxt aHint( nStartPos, rText.Len() ); - SwModify::Modify( 0, &aHint ); + NotifyClients( 0, &aHint ); } namespace { @@ -3479,7 +3467,7 @@ namespace { // End of method <HandleModifyAtTxtNode> } -void SwTxtNode::Modify( SfxPoolItem* pOldValue, SfxPoolItem* pNewValue ) +void SwTxtNode::Modify( const SfxPoolItem* pOldValue, const SfxPoolItem* pNewValue ) { bool bWasNotifiable = m_bNotifiable; m_bNotifiable = false; @@ -3490,7 +3478,7 @@ void SwTxtNode::Modify( SfxPoolItem* pOldValue, SfxPoolItem* pNewValue ) // Bug25481: // bei Nodes im Undo nie _ChgTxtCollUpdateNum rufen. if( pOldValue && pNewValue && RES_FMT_CHG == pOldValue->Which() && - pRegisteredIn == ((SwFmtChg*)pNewValue)->pChangedFmt && + GetRegisteredIn() == ((SwFmtChg*)pNewValue)->pChangedFmt && GetNodes().IsDocNodes() ) { _ChgTxtCollUpdateNum( @@ -4800,7 +4788,6 @@ sal_uInt16 SwTxtNode::ResetAllAttr() } // <-- - // sw::Metadatable ::sfx2::IXmlIdRegistry& SwTxtNode::GetRegistry() { @@ -4822,6 +4809,13 @@ bool SwTxtNode::IsInContent() const return !GetDoc()->IsInHeaderFooter( SwNodeIndex(*this) ); } +void SwTxtNode::SwClientNotify( const SwModify& rModify, const SfxHint& rHint ) +{ + const SwAttrHint* pHint = dynamic_cast<const SwAttrHint*>(&rHint); + if ( pHint && pHint->GetId() == RES_CONDTXTFMTCOLL && &rModify == GetRegisteredIn() ) + ChkCondColl(); +} + #include <unoparagraph.hxx> uno::Reference< rdf::XMetadatable > diff --git a/sw/source/core/txtnode/thints.cxx b/sw/source/core/txtnode/thints.cxx index a7ccc96265cf..3ca7d01e1981 100644 --- a/sw/source/core/txtnode/thints.cxx +++ b/sw/source/core/txtnode/thints.cxx @@ -212,22 +212,20 @@ splitPolicy(const sal_uInt16 nWhichNew, const sal_uInt16 nWhichOther) } } -static void -lcl_InitINetFmt(SwTxtNode & rNode, SwTxtINetFmt * pNew) +void SwTxtINetFmt::InitINetFmt(SwTxtNode & rNode) { - pNew->ChgTxtNode(&rNode); + ChgTxtNode(&rNode); SwCharFmt * const pFmt( rNode.GetDoc()->GetCharFmtFromPool(RES_POOLCHR_INET_NORMAL) ); - pFmt->Add( pNew ); + pFmt->Add( this ); } -static void -lcl_InitRuby(SwTxtNode & rNode, SwTxtRuby * pNew) +void SwTxtRuby::InitRuby(SwTxtNode & rNode) { - pNew->ChgTxtNode(&rNode); + ChgTxtNode(&rNode); SwCharFmt * const pFmt( rNode.GetDoc()->GetCharFmtFromPool(RES_POOLCHR_RUBYTEXT) ); - pFmt->Add( pNew ); + pFmt->Add( this ); } /** @@ -243,12 +241,12 @@ MakeTxtAttrNesting(SwTxtNode & rNode, SwTxtAttrNesting & rNesting, { case RES_TXTATR_INETFMT: { - lcl_InitINetFmt(rNode, static_cast<SwTxtINetFmt*>(pNew)); + static_cast<SwTxtINetFmt*>(pNew)->InitINetFmt(rNode); break; } case RES_TXTATR_CJK_RUBY: { - lcl_InitRuby(rNode, static_cast<SwTxtRuby*>(pNew)); + static_cast<SwTxtRuby*>(pNew)->InitRuby(rNode); break; } default: @@ -994,7 +992,8 @@ SwTxtAttr* MakeRedlineTxtAttr( SwDoc & rDoc, SfxPoolItem & rAttr ) // create new text attribute SwTxtAttr* MakeTxtAttr( SwDoc & rDoc, SfxPoolItem& rAttr, - xub_StrLen nStt, xub_StrLen nEnd ) + xub_StrLen const nStt, xub_StrLen const nEnd, + CopyOrNew_t const bIsCopy, SwTxtNode *const pTxtNode) { if ( isCHRATR(rAttr.Which()) ) { @@ -1075,7 +1074,8 @@ SwTxtAttr* MakeTxtAttr( SwDoc & rDoc, SfxPoolItem& rAttr, break; case RES_TXTATR_META: case RES_TXTATR_METAFIELD: - pNew = new SwTxtMeta( static_cast<SwFmtMeta&>(rNew), nStt, nEnd ); + pNew = SwTxtMeta::CreateTxtMeta( rDoc.GetMetaFieldManager(), pTxtNode, + static_cast<SwFmtMeta&>(rNew), nStt, nEnd, bIsCopy ); break; default: OSL_ENSURE(RES_TXTATR_AUTOFMT == rNew.Which(), "unknown attribute"); @@ -1190,7 +1190,7 @@ void SwTxtNode::DestroyAttr( SwTxtAttr* pAttr ) if( nDelMsg && !pDoc->IsInDtor() && GetNodes().IsDocNodes() ) { SwPtrMsgPoolItem aMsgHint( nDelMsg, (void*)&pAttr->GetAttr() ); - pDoc->GetUnoCallBack()->Modify( &aMsgHint, &aMsgHint ); + pDoc->GetUnoCallBack()->ModifyNotification( &aMsgHint, &aMsgHint ); } SwTxtAttr::Destroy( pAttr, pDoc->GetAttrPool() ); @@ -1209,7 +1209,8 @@ SwTxtNode::InsertItem( SfxPoolItem& rAttr, OSL_ENSURE( !isCHRATR(rAttr.Which()), "AUTOSTYLES - " "SwTxtNode::InsertItem should not be called with character attributes"); - SwTxtAttr* const pNew = MakeTxtAttr( *GetDoc(), rAttr, nStart, nEnd ); + SwTxtAttr *const pNew = MakeTxtAttr( *GetDoc(), rAttr, nStart, nEnd, + (nMode & nsSetAttrMode::SETATTR_IS_COPY) ? COPY : NEW, this ); if ( pNew ) { @@ -1516,7 +1517,7 @@ void SwTxtNode::DeleteAttribute( SwTxtAttr * const pAttr ) *pAttr->GetStart(), *pAttr->GetEnd(), pAttr->Which() ); m_pSwpHints->Delete( pAttr ); SwTxtAttr::Destroy( pAttr, GetDoc()->GetAttrPool() ); - SwModify::Modify( 0, &aHint ); // notify Frames + NotifyClients( 0, &aHint ); TryDeleteSwpHints(); } @@ -1584,7 +1585,7 @@ void SwTxtNode::DeleteAttributes( const sal_uInt16 nWhich, SwUpdateAttr aHint( nStart, *pEndIdx, nWhich ); m_pSwpHints->DeleteAtPos( nPos ); // gefunden, loeschen, SwTxtAttr::Destroy( pTxtHt, GetDoc()->GetAttrPool() ); - SwModify::Modify( 0, &aHint ); // die Frames benachrichtigen + NotifyClients( 0, &aHint ); } } } @@ -2329,7 +2330,7 @@ void SwTxtNode::FmtToTxtAttr( SwTxtNode* pNd ) if( aNdSet.Count() ) { SwFmtChg aTmp1( pNd->GetFmtColl() ); - pNd->SwModify::Modify( &aTmp1, &aTmp1 ); + pNd->NotifyClients( &aTmp1, &aTmp1 ); } } } @@ -2620,7 +2621,7 @@ bool SwpHints::TryInsertHint( SwTxtAttr* const pHint, SwTxtNode &rNode, } // <-- case RES_TXTATR_INETFMT: - lcl_InitINetFmt(rNode, static_cast<SwTxtINetFmt*>(pHint)); + static_cast<SwTxtINetFmt*>(pHint)->InitINetFmt(rNode); break; case RES_TXTATR_FIELD: { @@ -2673,7 +2674,7 @@ bool SwpHints::TryInsertHint( SwTxtAttr* const pHint, SwTxtNode &rNode, { SwFmtFld* pFmtFld = (SwFmtFld*)&((SwTxtFld*)pHint) ->GetFld(); - pFldType->Add( pFmtFld ); // ummelden + pFmtFld->RegisterToFieldType( *pFldType ); pFmtFld->GetFld()->ChgTyp( pFldType ); } pFldType->SetSeqRefNo( *(SwSetExpField*)pFld ); @@ -2754,7 +2755,7 @@ bool SwpHints::TryInsertHint( SwTxtAttr* const pHint, SwTxtNode &rNode, break; case RES_TXTATR_CJK_RUBY: - lcl_InitRuby(rNode, static_cast<SwTxtRuby*>(pHint)); + static_cast<SwTxtRuby*>(pHint)->InitRuby(rNode); break; case RES_TXTATR_META: @@ -2787,7 +2788,7 @@ bool SwpHints::TryInsertHint( SwTxtAttr* const pHint, SwTxtNode &rNode, if ( rNode.GetDepends() ) { SwUpdateAttr aHint( nHtStart, nHtStart, nWhich ); - rNode.Modify( 0, &aHint ); + rNode.ModifyNotification( 0, &aHint ); } return true; } @@ -2869,7 +2870,7 @@ bool SwpHints::TryInsertHint( SwTxtAttr* const pHint, SwTxtNode &rNode, if ( rNode.GetDepends() ) { SwUpdateAttr aHint( nHtStart, nHtStart == nHintEnd ? nHintEnd + 1 : nHintEnd, nWhich ); - rNode.Modify( 0, &aHint ); + rNode.ModifyNotification( 0, &aHint ); } #if OSL_DEBUG_LEVEL > 1 diff --git a/sw/source/core/txtnode/txtatr2.cxx b/sw/source/core/txtnode/txtatr2.cxx index 599d0853b1c1..5db0ab4b6f4a 100644 --- a/sw/source/core/txtnode/txtatr2.cxx +++ b/sw/source/core/txtnode/txtatr2.cxx @@ -68,7 +68,7 @@ SwTxtCharFmt::~SwTxtCharFmt( ) { } -void SwTxtCharFmt::Modify( SfxPoolItem* pOld, SfxPoolItem* pNew ) +void SwTxtCharFmt::ModifyNotification( const SfxPoolItem* pOld, const SfxPoolItem* pNew ) { sal_uInt16 nWhich = pOld ? pOld->Which() : pNew ? pNew->Which() : 0; OSL_ENSURE( isCHRATR(nWhich) || (RES_OBJECTDYING == nWhich) @@ -78,21 +78,20 @@ void SwTxtCharFmt::Modify( SfxPoolItem* pOld, SfxPoolItem* pNew ) if ( m_pTxtNode ) { SwUpdateAttr aUpdateAttr( *GetStart(), *GetEnd(), nWhich ); - m_pTxtNode->Modify( &aUpdateAttr, &aUpdateAttr ); + m_pTxtNode->ModifyNotification( &aUpdateAttr, &aUpdateAttr ); } } - // erfrage vom Modify Informationen -sal_Bool SwTxtCharFmt::GetInfo( SfxPoolItem& rInfo ) const +bool SwTxtCharFmt::GetInfo( SfxPoolItem& rInfo ) const { if ( RES_AUTOFMT_DOCNODE != rInfo.Which() || !m_pTxtNode || &m_pTxtNode->GetNodes() != static_cast<SwAutoFmtGetDocNode&>(rInfo).pNodes ) { - return sal_True; + return true; } static_cast<SwAutoFmtGetDocNode&>(rInfo).pCntntNode = m_pTxtNode; - return sal_False; + return false; } @@ -182,12 +181,12 @@ SwCharFmt* SwTxtINetFmt::GetCharFmt() if( pRet ) pRet->Add( this ); else if( GetRegisteredIn() ) - pRegisteredIn->Remove( this ); + GetRegisteredInNonConst()->Remove( this ); return pRet; } -void SwTxtINetFmt::Modify( SfxPoolItem* pOld, SfxPoolItem* pNew ) +void SwTxtINetFmt::Modify( const SfxPoolItem* pOld, const SfxPoolItem* pNew ) { sal_uInt16 nWhich = pOld ? pOld->Which() : pNew ? pNew->Which() : 0; OSL_ENSURE( isCHRATR(nWhich) || (RES_OBJECTDYING == nWhich) @@ -197,7 +196,7 @@ void SwTxtINetFmt::Modify( SfxPoolItem* pOld, SfxPoolItem* pNew ) if ( m_pTxtNode ) { SwUpdateAttr aUpdateAttr( *GetStart(), *GetEnd(), nWhich ); - m_pTxtNode->Modify( &aUpdateAttr, &aUpdateAttr ); + m_pTxtNode->ModifyNotification( &aUpdateAttr, &aUpdateAttr ); } } @@ -236,7 +235,7 @@ SwTxtRuby::~SwTxtRuby() { } -void SwTxtRuby::Modify( SfxPoolItem *pOld, SfxPoolItem *pNew ) +void SwTxtRuby::Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew ) { sal_uInt16 nWhich = pOld ? pOld->Which() : pNew ? pNew->Which() : 0; OSL_ENSURE( isCHRATR(nWhich) || (RES_OBJECTDYING == nWhich) @@ -246,7 +245,7 @@ void SwTxtRuby::Modify( SfxPoolItem *pOld, SfxPoolItem *pNew ) if ( m_pTxtNode ) { SwUpdateAttr aUpdateAttr( *GetStart(), *GetEnd(), nWhich ); - m_pTxtNode->Modify( &aUpdateAttr, &aUpdateAttr ); + m_pTxtNode->ModifyNotification( &aUpdateAttr, &aUpdateAttr ); } } @@ -299,7 +298,7 @@ SwCharFmt* SwTxtRuby::GetCharFmt() if( pRet ) pRet->Add( this ); else if( GetRegisteredIn() ) - pRegisteredIn->Remove( this ); + GetRegisteredInNonConst()->Remove( this ); return pRet; } @@ -309,10 +308,25 @@ SwCharFmt* SwTxtRuby::GetCharFmt() * class SwTxtMeta *************************************************************************/ +SwTxtMeta * +SwTxtMeta::CreateTxtMeta( + ::sw::MetaFieldManager & i_rTargetDocManager, + SwTxtNode *const i_pTargetTxtNode, + SwFmtMeta & i_rAttr, + xub_StrLen const i_nStart, xub_StrLen const i_nEnd, bool const i_bIsCopy) +{ + if (COPY == i_bIsCopy) + { // i_rAttr is already cloned, now call DoCopy to copy the sw::Meta + OSL_ENSURE(i_pTargetTxtNode, "cannot copy Meta without target node"); + i_rAttr.DoCopy(i_rTargetDocManager, *i_pTargetTxtNode); + } + SwTxtMeta *const pTxtMeta(new SwTxtMeta(i_rAttr, i_nStart, i_nEnd)); + return pTxtMeta; +} + SwTxtMeta::SwTxtMeta( SwFmtMeta & i_rAttr, const xub_StrLen i_nStart, const xub_StrLen i_nEnd ) : SwTxtAttrNesting( i_rAttr, i_nStart, i_nEnd ) - , m_pTxtNode( 0 ) { i_rAttr.SetTxtAttr( this ); SetHasDummyChar(true); @@ -329,7 +343,6 @@ SwTxtMeta::~SwTxtMeta() void SwTxtMeta::ChgTxtNode(SwTxtNode * const pNode) { - m_pTxtNode = pNode; // before Notify! SwFmtMeta & rFmtMeta( static_cast<SwFmtMeta &>(GetAttr()) ); if (rFmtMeta.GetTxtAttr() == this) { diff --git a/sw/source/core/txtnode/txtedt.cxx b/sw/source/core/txtnode/txtedt.cxx index bfb76e8a552d..917ae6c83068 100644..100755 --- a/sw/source/core/txtnode/txtedt.cxx +++ b/sw/source/core/txtnode/txtedt.cxx @@ -606,9 +606,9 @@ void SwTxtNode::RstAttr(const SwIndex &rIdx, xub_StrLen nLen, sal_uInt16 nWhich, } //TxtFrm's reagieren auf aHint, andere auf aNew SwUpdateAttr aHint( nMin, nMax, 0 ); - SwModify::Modify( 0, &aHint ); + NotifyClients( 0, &aHint ); SwFmtChg aNew( GetFmtColl() ); - SwModify::Modify( 0, &aNew ); + NotifyClients( 0, &aNew ); } } @@ -951,11 +951,11 @@ void SwTxtNode::SetLanguageAndFont( const SwPaM &rPaM, if (pFont) { SvxFontItem aFontItem = (SvxFontItem&) aSet.Get( nFontWhichId ); - aFontItem.GetFamilyName() = pFont->GetName(); - aFontItem.GetFamily() = pFont->GetFamily(); - aFontItem.GetStyleName() = pFont->GetStyleName(); - aFontItem.GetPitch() = pFont->GetPitch(); - aFontItem.GetCharSet() = pFont->GetCharSet(); + aFontItem.SetFamilyName( pFont->GetName()); + aFontItem.SetFamily( pFont->GetFamily()); + aFontItem.SetStyleName( pFont->GetStyleName()); + aFontItem.SetPitch( pFont->GetPitch()); + aFontItem.SetCharSet( pFont->GetCharSet() ); aSet.Put( aFontItem ); } @@ -1466,7 +1466,7 @@ sal_Bool SwTxtNode::Hyphenate( SwInterHyphInfo &rHyphInf ) if( pLinguNode != this ) { pLinguNode = this; - pLinguFrm = (SwTxtFrm*)GetFrm( (Point*)(rHyphInf.GetCrsrPos()) ); + pLinguFrm = (SwTxtFrm*)getLayoutFrm( GetDoc()->GetCurrentLayout(), (Point*)(rHyphInf.GetCrsrPos()) ); } SwTxtFrm *pFrm = pLinguFrm; if( pFrm ) @@ -1783,10 +1783,10 @@ void SwTxtNode::ReplaceTextOnly( xub_StrLen nPos, xub_StrLen nLen, // notify the layout! SwDelTxt aDelHint( nPos, nTLen ); - SwModify::Modify( 0, &aDelHint ); + NotifyClients( 0, &aDelHint ); SwInsTxt aHint( nPos, nTLen ); - SwModify::Modify( 0, &aHint ); + NotifyClients( 0, &aHint ); } void SwTxtNode::CountWords( SwDocStat& rStat, diff --git a/sw/source/core/undo/SwUndoPageDesc.cxx b/sw/source/core/undo/SwUndoPageDesc.cxx index 49bcb0d4175e..2b6494003109 100644 --- a/sw/source/core/undo/SwUndoPageDesc.cxx +++ b/sw/source/core/undo/SwUndoPageDesc.cxx @@ -64,15 +64,9 @@ void DebugHeaderFooterContent( const SwPageDesc& rPageDesc ) SwFrmFmt* pHeaderFmt = rHead.GetHeaderFmt(); if( pHeaderFmt ) { - SwClientIter aIter( *pHeaderFmt ); - SwClient *pLast = aIter.GoStart(); - if( pLast ) + nHeaderCount = pHeaderFmt->GetClientCount(); { int nHeaderCount = 0; - do - { - ++nHeaderCount; - } while( 0 != ( pLast = aIter++ )); } const SwFmtCntnt* pCntnt = &pHeaderFmt->GetCntnt(); if( pCntnt->GetCntntIdx() ) @@ -83,15 +77,9 @@ void DebugHeaderFooterContent( const SwPageDesc& rPageDesc ) SwFrmFmt* pLeftHeaderFmt = rLeftHead.GetHeaderFmt(); if( pLeftHeaderFmt ) { - SwClientIter aIter( *pLeftHeaderFmt ); - SwClient *pLast = aIter.GoStart(); - if( pLast ) + nLeftHeaderCount = pLeftHeaderFmt->GetClientCount(); { int nLeftHeaderCount = 0; - do - { - ++nLeftHeaderCount; - } while( 0 != ( pLast = aIter++ )); } const SwFmtCntnt* pLeftCntnt = &pLeftHeaderFmt->GetCntnt(); if( pLeftCntnt->GetCntntIdx() ) @@ -105,15 +93,9 @@ void DebugHeaderFooterContent( const SwPageDesc& rPageDesc ) SwFrmFmt* pFooterFmt = rFoot.GetFooterFmt(); if( pFooterFmt ) { - SwClientIter aIter( *pFooterFmt ); - SwClient *pLast = aIter.GoStart(); - if( pLast ) + nFooterCount = pFooterFmt->GetClientCount(); { int nFooterCount = 0; - do - { - ++nFooterCount; - } while( 0 != ( pLast = aIter++ )); } const SwFmtCntnt* pCntnt = &pFooterFmt->GetCntnt(); if( pCntnt->GetCntntIdx() ) @@ -124,15 +106,9 @@ void DebugHeaderFooterContent( const SwPageDesc& rPageDesc ) SwFrmFmt* pLeftFooterFmt = rLeftFoot.GetFooterFmt(); if( pLeftFooterFmt ) { - SwClientIter aIter( *pLeftFooterFmt ); - SwClient *pLast = aIter.GoStart(); - if( pLast ) + nLeftFooterCount = pLeftFooterFmt->GetClientCount(); { int nLeftFooterCount = 0; - do - { - ++nLeftFooterCount; - } while( 0 != ( pLast = aIter++ )); } const SwFmtCntnt* pLeftCntnt = &pLeftFooterFmt->GetCntnt(); if( pLeftCntnt->GetCntntIdx() ) diff --git a/sw/source/core/undo/rolbck.cxx b/sw/source/core/undo/rolbck.cxx index a58c21d2e619..970403d5cd1f 100644 --- a/sw/source/core/undo/rolbck.cxx +++ b/sw/source/core/undo/rolbck.cxx @@ -366,7 +366,7 @@ SwHistorySetTOXMark::SwHistorySetTOXMark( SwTxtTOXMark* pTxtHt, sal_uLong nNodeP , m_nStart( *pTxtHt->GetStart() ) , m_nEnd( *pTxtHt->GetAnyEnd() ) { - const_cast<SwModify*>(m_TOXMark.GetRegisteredIn())->Remove( &m_TOXMark ); + m_TOXMark.DeRegister(); } @@ -395,7 +395,7 @@ void SwHistorySetTOXMark::SetInDoc( SwDoc* pDoc, bool ) } SwTOXMark aNew( m_TOXMark ); - pToxType->Add( &aNew ); + aNew.RegisterToTOXType( *pToxType ); pTxtNd->InsertItem( aNew, m_nStart, m_nEnd, nsSetAttrMode::SETATTR_NOTXTATRCHR ); @@ -941,7 +941,7 @@ void SwHistoryChangeFlyAnchor::SetInDoc( SwDoc* pDoc, bool ) aTmp.SetAnchor( &aPos ); // so the Layout does not get confused - if ( !pCNd || !pCNd->GetFrm( 0, 0, sal_False ) ) + if ( !pCNd || !pCNd->getLayoutFrm( pDoc->GetCurrentLayout(), 0, 0, sal_False ) ) { m_rFmt.DelFrms(); } @@ -1372,7 +1372,7 @@ SwRegHistory::SwRegHistory( const SwNode& rNd, SwHistory* pHst ) _MakeSetWhichIds(); } -void SwRegHistory::Modify( SfxPoolItem* pOld, SfxPoolItem* pNew ) +void SwRegHistory::Modify( const SfxPoolItem* pOld, const SfxPoolItem* pNew ) { // --> OD 2010-10-05 #i114861# // Do not handle a "noop" modify @@ -1390,7 +1390,7 @@ void SwRegHistory::Modify( SfxPoolItem* pOld, SfxPoolItem* pNew ) { SwHistoryHint* pNewHstr; const SfxItemSet& rSet = - *static_cast<SwAttrSetChg*>(pOld)->GetChgSet(); + *static_cast<const SwAttrSetChg*>(pOld)->GetChgSet(); if ( 1 < rSet.Count() ) { pNewHstr = diff --git a/sw/source/core/undo/unattr.cxx b/sw/source/core/undo/unattr.cxx index 14a3d1e776cc..0d585f42aa0e 100644 --- a/sw/source/core/undo/unattr.cxx +++ b/sw/source/core/undo/unattr.cxx @@ -67,7 +67,7 @@ #include <redline.hxx> #include <section.hxx> #include <charfmt.hxx> - +#include <switerator.hxx> // ----------------------------------------------------- @@ -79,49 +79,52 @@ SwUndoFmtAttrHelper::SwUndoFmtAttrHelper( SwFmt& rFmt, bool bSvDrwPt ) { } -void SwUndoFmtAttrHelper::Modify( SfxPoolItem* pOld, SfxPoolItem* pNew ) +void SwUndoFmtAttrHelper::Modify( const SfxPoolItem* pOld, const SfxPoolItem* pNew ) { - if( pOld && pNew ) + if( pOld ) { - if( POOLATTR_END >= pOld->Which() ) + if ( pOld->Which() == RES_OBJECTDYING ) { - if ( GetUndo() ) - { - m_pUndo->PutAttr( *pOld ); - } - else - { - m_pUndo.reset( new SwUndoFmtAttr( *pOld, - *static_cast<SwFmt*>(pRegisteredIn), m_bSaveDrawPt ) ); - } + CheckRegistration( pOld, pNew ); } - else if ( RES_ATTRSET_CHG == pOld->Which() ) + else if ( pNew ) { - if ( GetUndo() ) + if( POOLATTR_END >= pOld->Which() ) { - SfxItemIter aIter( - *(static_cast<SwAttrSetChg*>(pOld))->GetChgSet() ); - const SfxPoolItem* pItem = aIter.GetCurItem(); - while ( pItem ) + if ( GetUndo() ) { - m_pUndo->PutAttr( *pItem ); - if( aIter.IsAtEnd() ) - break; - pItem = aIter.NextItem(); + m_pUndo->PutAttr( *pOld ); + } + else + { + m_pUndo.reset( new SwUndoFmtAttr( *pOld, + *static_cast<SwFmt*>(GetRegisteredInNonConst()), m_bSaveDrawPt ) ); } } - else + else if ( RES_ATTRSET_CHG == pOld->Which() ) { - m_pUndo.reset( new SwUndoFmtAttr( - *static_cast<SwAttrSetChg*>(pOld)->GetChgSet(), - *static_cast<SwFmt*>(pRegisteredIn), m_bSaveDrawPt ) ); + if ( GetUndo() ) + { + SfxItemIter aIter( + *(static_cast<const SwAttrSetChg*>(pOld))->GetChgSet() ); + const SfxPoolItem* pItem = aIter.GetCurItem(); + while ( pItem ) + { + m_pUndo->PutAttr( *pItem ); + if( aIter.IsAtEnd() ) + break; + pItem = aIter.NextItem(); + } + } + else + { + m_pUndo.reset( new SwUndoFmtAttr( + *static_cast<const SwAttrSetChg*>(pOld)->GetChgSet(), + *static_cast<SwFmt*>(GetRegisteredInNonConst()), m_bSaveDrawPt ) ); + } } } - else - SwClient::Modify( pOld, pNew ); } - else - SwClient::Modify( pOld, pNew ); } // ----------------------------------------------------- @@ -168,8 +171,7 @@ void SwUndoFmtAttr::Init() static_cast<const SwFrmFmtPtr>(m_pFmt))) { // Table Format: save table position, table formats are volatile! - SwTable * pTbl = static_cast<SwTable*>( - SwClientIter( *m_pFmt ).First( TYPE( SwTable )) ); + SwTable * pTbl = SwIterator<SwTable,SwFmt>::FirstElement( *m_pFmt ); if ( pTbl ) { m_nNodeIndex = pTbl->GetTabSortBoxes()[ 0 ]->GetSttNd() @@ -183,8 +185,7 @@ void SwUndoFmtAttr::Init() } else if ( 0 != dynamic_cast< SwTableBoxFmt* >( m_pFmt ) ) { - SwTableBox* pTblBox = static_cast< SwTableBox* >( - SwClientIter( *m_pFmt ).First( TYPE( SwTableBox ))); + SwTableBox * pTblBox = SwIterator<SwTableBox,SwFmt>::FirstElement( *m_pFmt ); if ( pTblBox ) { m_nNodeIndex = pTblBox->GetSttIdx(); @@ -516,7 +517,7 @@ bool SwUndoFmtAttr::RestoreFlyAnchor(::sw::UndoRedoContext & rContext) aNewAnchor.SetPageNum( rAnchor.GetPageNum() ); Point aDrawSavePt, aDrawOldPt; - if( pDoc->GetRootFrm() ) + if( pDoc->GetCurrentViewShell() ) //swmod 071108//swmod 071225 { if( RES_DRAWFRMFMT == pFrmFmt->Which() ) { diff --git a/sw/source/core/undo/undobj1.cxx b/sw/source/core/undo/undobj1.cxx index e1ad04df0d3c..49471cf4501f 100644 --- a/sw/source/core/undo/undobj1.cxx +++ b/sw/source/core/undo/undobj1.cxx @@ -172,7 +172,7 @@ void SwUndoFlyBase::DelFly( SwDoc* pDoc ) // alle Uno-Objecte sollten sich jetzt abmelden { SwPtrMsgPoolItem aMsgHint( RES_REMOVE_UNO_OBJECT, pFrmFmt ); - pFrmFmt->Modify( &aMsgHint, &aMsgHint ); + pFrmFmt->ModifyNotification( &aMsgHint, &aMsgHint ); } if ( RES_DRAWFRMFMT != pFrmFmt->Which() ) @@ -342,8 +342,7 @@ void SwUndoInsLayFmt::RepeatImpl(::sw::RepeatContext & rContext) } else if (FLY_AT_PAGE == aAnchor.GetAnchorId()) { - aAnchor.SetPageNum( - pDoc->GetRootFrm()->GetCurrPage(& rContext.GetRepeatPaM()) ); + aAnchor.SetPageNum( pDoc->GetCurrentLayout()->GetCurrPage( &rContext.GetRepeatPaM() )); } else { OSL_FAIL( "was fuer ein Anker ist es denn nun?" ); @@ -506,6 +505,11 @@ SwUndoSetFlyFmt::~SwUndoSetFlyFmt() delete pItemSet; } +void SwUndoSetFlyFmt::DeRegisterFromFormat( SwFmt& rFmt ) +{ + rFmt.Remove(this); +} + void SwUndoSetFlyFmt::GetAnchor( SwFmtAnchor& rAnchor, sal_uLong nNode, xub_StrLen nCntnt ) { @@ -699,7 +703,7 @@ void SwUndoSetFlyFmt::PutAttr( sal_uInt16 nWhich, const SfxPoolItem* pItem ) pItemSet->InvalidateItem( nWhich ); } -void SwUndoSetFlyFmt::Modify( SfxPoolItem* pOld, SfxPoolItem* ) +void SwUndoSetFlyFmt::Modify( const SfxPoolItem* pOld, const SfxPoolItem* ) { if( pOld ) { diff --git a/sw/source/core/undo/undraw.cxx b/sw/source/core/undo/undraw.cxx index 2c93d6a55045..b92ce4f488a9 100644 --- a/sw/source/core/undo/undraw.cxx +++ b/sw/source/core/undo/undraw.cxx @@ -34,6 +34,7 @@ #include <rtl/string.h> #include <rtl/memory.h> +#include <rtl/string.h> #include <svx/svdogrp.hxx> #include <svx/svdundo.hxx> #include <svx/svdpage.hxx> @@ -64,9 +65,6 @@ struct SwUndoGroupObjImpl SwDrawFrmFmt* pFmt; SdrObject* pObj; sal_uLong nNodeIdx; - - // OD 2004-04-15 #i26791# - keeping the anchor and the relative position - // of drawing objects no longer needed }; @@ -84,7 +82,7 @@ IMPL_LINK( SwDoc, AddDrawUndo, SdrUndoAction *, pUndo ) GetIDocumentUndoRedo().DoesDrawUndo()) { const SdrMarkList* pMarkList = 0; - ViewShell* pSh = GetRootFrm() ? GetRootFrm()->GetCurrShell() : 0; + ViewShell* pSh = GetCurrentViewShell(); if( pSh && pSh->HasDrawView() ) pMarkList = &pSh->GetDrawView()->GetMarkedObjectList(); @@ -132,7 +130,7 @@ String SwSdrUndo::GetComment() const void lcl_SendRemoveToUno( SwFmt& rFmt ) { SwPtrMsgPoolItem aMsgHint( RES_REMOVE_UNO_OBJECT, &rFmt ); - rFmt.Modify( &aMsgHint, &aMsgHint ); + rFmt.ModifyNotification( &aMsgHint, &aMsgHint ); } void lcl_SaveAnchor( SwFrmFmt* pFmt, sal_uLong& rNodePos ) @@ -150,15 +148,15 @@ void lcl_SaveAnchor( SwFrmFmt* pFmt, sal_uLong& rNodePos ) { nCntntPos = rAnchor.GetCntntAnchor()->nContent.GetIndex(); - // TextAttribut zerstoeren + // destroy TextAttribute SwTxtNode *pTxtNd = pFmt->GetDoc()->GetNodes()[ rNodePos ]->GetTxtNode(); - OSL_ENSURE( pTxtNd, "Kein Textnode gefunden" ); + OSL_ENSURE( pTxtNd, "No text node found!" ); SwTxtFlyCnt* pAttr = static_cast<SwTxtFlyCnt*>( pTxtNd->GetTxtAttrForCharAt( nCntntPos, RES_TXTATR_FLYCNT )); - // Attribut steht noch im TextNode, loeschen + // attribute still in text node, delete if( pAttr && pAttr->GetFlyCnt().GetFrmFmt() == pFmt ) { - // Pointer auf 0, nicht loeschen + // just set pointer to 0, don't delete ((SwFmtFlyCnt&)pAttr->GetFlyCnt()).SetFlyFmt(); SwIndex aIdx( pTxtNd, nCntntPos ); pTxtNd->EraseText( aIdx, 1 ); @@ -221,7 +219,7 @@ SwUndoDrawGroup::~SwUndoDrawGroup() delete pTmp->pFmt; } else - delete pObjArr->pFmt; // das GroupObject-Format + delete pObjArr->pFmt; delete [] pObjArr; } @@ -230,22 +228,22 @@ void SwUndoDrawGroup::UndoImpl(::sw::UndoRedoContext &) { bDelFmt = sal_False; - // das Group-Object sichern + // save group object SwDrawFrmFmt* pFmt = pObjArr->pFmt; SwDrawContact* pDrawContact = (SwDrawContact*)pFmt->FindContactObj(); SdrObject* pObj = pDrawContact->GetMaster(); pObjArr->pObj = pObj; - //loescht sich selbst! + // object will destroy itself pDrawContact->Changed( *pObj, SDRUSERCALL_DELETE, pObj->GetLastBoundRect() ); pObj->SetUserCall( 0 ); ::lcl_SaveAnchor( pFmt, pObjArr->nNodeIdx ); - // alle Uno-Objecte sollten sich jetzt abmelden + // notify UNO objects to decouple ::lcl_SendRemoveToUno( *pFmt ); - // aus dem Array austragen + // remove from array SwDoc* pDoc = pFmt->GetDoc(); SwSpzFrmFmts& rFlyFmts = *(SwSpzFrmFmts*)pDoc->GetSpzFrmFmts(); rFlyFmts.Remove( rFlyFmts.GetPos( pFmt )); @@ -261,19 +259,15 @@ void SwUndoDrawGroup::UndoImpl(::sw::UndoRedoContext &) SwDrawContact *pContact = new SwDrawContact( rSave.pFmt, pObj ); pContact->ConnectToLayout(); - // --> OD 2005-03-22 #i45718# - follow-up of #i35635# - // move object to visible layer + // #i45718# - follow-up of #i35635# move object to visible layer pContact->MoveObjToVisibleLayer( pObj ); - // <-- - // --> OD 2005-05-10 #i45952# - notify that position attributes - // are already set + // #i45952# - notify that position attributes are already set OSL_ENSURE( rSave.pFmt->ISA(SwDrawFrmFmt), "<SwUndoDrawGroup::Undo(..)> - wrong type of frame format for drawing object" ); if ( rSave.pFmt->ISA(SwDrawFrmFmt) ) { static_cast<SwDrawFrmFmt*>(rSave.pFmt)->PosAttrSet(); } - // <-- } } @@ -281,7 +275,7 @@ void SwUndoDrawGroup::RedoImpl(::sw::UndoRedoContext &) { bDelFmt = sal_True; - // aus dem Array austragen + // remove from array SwDoc* pDoc = pObjArr->pFmt->GetDoc(); SwSpzFrmFmts& rFlyFmts = *(SwSpzFrmFmts*)pDoc->GetSpzFrmFmts(); SdrObject* pObj; @@ -293,38 +287,35 @@ void SwUndoDrawGroup::RedoImpl(::sw::UndoRedoContext &) pObj = rSave.pObj; SwDrawContact *pContact = (SwDrawContact*)GetUserCall(pObj); - //loescht sich selbst! + + // object will destroy itself pContact->Changed( *pObj, SDRUSERCALL_DELETE, pObj->GetLastBoundRect() ); pObj->SetUserCall( 0 ); ::lcl_SaveAnchor( rSave.pFmt, rSave.nNodeIdx ); - // alle Uno-Objecte sollten sich jetzt abmelden + // notify UNO objects to decouple ::lcl_SendRemoveToUno( *rSave.pFmt ); rFlyFmts.Remove( rFlyFmts.GetPos( rSave.pFmt )); } - // das Group-Object wieder einfuegen + // re-insert group object ::lcl_RestoreAnchor( pObjArr->pFmt, pObjArr->nNodeIdx ); rFlyFmts.Insert( pObjArr->pFmt, rFlyFmts.Count() ); SwDrawContact *pContact = new SwDrawContact( pObjArr->pFmt, pObjArr->pObj ); - // OD 2004-04-15 #i26791# - correction: connect object to layout + // #i26791# - correction: connect object to layout pContact->ConnectToLayout(); - // --> OD 2005-03-22 #i45718# - follow-up of #i35635# - // move object to visible layer + // #i45718# - follow-up of #i35635# move object to visible layer pContact->MoveObjToVisibleLayer( pObjArr->pObj ); - // <-- - // --> OD 2005-05-10 #i45952# - notify that position attributes - // are already set + // #i45952# - notify that position attributes are already set OSL_ENSURE( pObjArr->pFmt->ISA(SwDrawFrmFmt), "<SwUndoDrawGroup::Undo(..)> - wrong type of frame format for drawing object" ); if ( pObjArr->pFmt->ISA(SwDrawFrmFmt) ) { static_cast<SwDrawFrmFmt*>(pObjArr->pFmt)->PosAttrSet(); } - // <-- } void SwUndoDrawGroup::AddObj( sal_uInt16 nPos, SwDrawFrmFmt* pFmt, SdrObject* pObj ) @@ -334,10 +325,10 @@ void SwUndoDrawGroup::AddObj( sal_uInt16 nPos, SwDrawFrmFmt* pFmt, SdrObject* pO rSave.pFmt = pFmt; ::lcl_SaveAnchor( pFmt, rSave.nNodeIdx ); - // alle Uno-Objecte sollten sich jetzt abmelden + // notify UNO objects to decouple ::lcl_SendRemoveToUno( *pFmt ); - // aus dem Array austragen + // remove from array SwSpzFrmFmts& rFlyFmts = *(SwSpzFrmFmts*)pFmt->GetDoc()->GetSpzFrmFmts(); rFlyFmts.Remove( rFlyFmts.GetPos( pFmt )); } @@ -363,16 +354,16 @@ SwUndoDrawUnGroup::SwUndoDrawUnGroup( SdrObjGroup* pObj ) pObjArr->pObj = pObj; pObjArr->pFmt = pFmt; - //loescht sich selbst! + // object will destroy itself pContact->Changed( *pObj, SDRUSERCALL_DELETE, pObj->GetLastBoundRect() ); pObj->SetUserCall( 0 ); ::lcl_SaveAnchor( pFmt, pObjArr->nNodeIdx ); - // alle Uno-Objecte sollten sich jetzt abmelden + // notify UNO objects to decouple ::lcl_SendRemoveToUno( *pFmt ); - // aus dem Array austragen + // remove from array SwSpzFrmFmts& rFlyFmts = *(SwSpzFrmFmts*)pFmt->GetDoc()->GetSpzFrmFmts(); rFlyFmts.Remove( rFlyFmts.GetPos( pFmt )); } @@ -386,7 +377,7 @@ SwUndoDrawUnGroup::~SwUndoDrawUnGroup() delete pTmp->pFmt; } else - delete pObjArr->pFmt; // das GroupObject-Format + delete pObjArr->pFmt; delete [] pObjArr; } @@ -403,65 +394,50 @@ void SwUndoDrawUnGroup::UndoImpl(::sw::UndoRedoContext & rContext) { SwUndoGroupObjImpl& rSave = *( pObjArr + n ); - // --> OD 2006-11-01 #130889# - taken over by <SwUndoDrawUnGroupConnectToLayout> -// SwDrawContact* pContact = (SwDrawContact*)rSave.pFmt->FindContactObj(); - -// rSave.pObj = pContact->GetMaster(); - -// //loescht sich selbst! -// pContact->Changed( *rSave.pObj, SDRUSERCALL_DELETE, -// rSave.pObj->GetLastBoundRect() ); -// rSave.pObj->SetUserCall( 0 ); - // <-- - ::lcl_SaveAnchor( rSave.pFmt, rSave.nNodeIdx ); - // alle Uno-Objecte sollten sich jetzt abmelden + // notify UNO objects to decouple ::lcl_SendRemoveToUno( *rSave.pFmt ); rFlyFmts.Remove( rFlyFmts.GetPos( rSave.pFmt )); } - // das Group-Object wieder einfuegen + // re-insert group object ::lcl_RestoreAnchor( pObjArr->pFmt, pObjArr->nNodeIdx ); rFlyFmts.Insert( pObjArr->pFmt, rFlyFmts.Count() ); SwDrawContact *pContact = new SwDrawContact( pObjArr->pFmt, pObjArr->pObj ); pContact->ConnectToLayout(); - // --> OD 2005-03-22 #i45718# - follow-up of #i35635# - // move object to visible layer + // #i45718# - follow-up of #i35635# move object to visible layer pContact->MoveObjToVisibleLayer( pObjArr->pObj ); - // <-- - // --> OD 2005-05-10 #i45952# - notify that position attributes - // are already set + // #i45952# - notify that position attributes are already set OSL_ENSURE( pObjArr->pFmt->ISA(SwDrawFrmFmt), "<SwUndoDrawGroup::Undo(..)> - wrong type of frame format for drawing object" ); if ( pObjArr->pFmt->ISA(SwDrawFrmFmt) ) { static_cast<SwDrawFrmFmt*>(pObjArr->pFmt)->PosAttrSet(); } - // <-- } void SwUndoDrawUnGroup::RedoImpl(::sw::UndoRedoContext &) { bDelFmt = sal_False; - // das Group-Object sichern + // save group object SwDrawFrmFmt* pFmt = pObjArr->pFmt; SwDrawContact* pContact = (SwDrawContact*)pFmt->FindContactObj(); - //loescht sich selbst! + // object will destroy itself pContact->Changed( *pObjArr->pObj, SDRUSERCALL_DELETE, pObjArr->pObj->GetLastBoundRect() ); pObjArr->pObj->SetUserCall( 0 ); ::lcl_SaveAnchor( pFmt, pObjArr->nNodeIdx ); - // alle Uno-Objecte sollten sich jetzt abmelden + // notify UNO objects to decouple ::lcl_SendRemoveToUno( *pFmt ); - // aus dem Array austragen + // remove from array SwDoc* pDoc = pFmt->GetDoc(); SwSpzFrmFmts& rFlyFmts = *(SwSpzFrmFmts*)pDoc->GetSpzFrmFmts(); rFlyFmts.Remove( rFlyFmts.GetPos( pFmt )); @@ -473,25 +449,13 @@ void SwUndoDrawUnGroup::RedoImpl(::sw::UndoRedoContext &) ::lcl_RestoreAnchor( rSave.pFmt, rSave.nNodeIdx ); rFlyFmts.Insert( rSave.pFmt, rFlyFmts.Count() ); - // --> OD 2006-11-01 #130889# - taken over by <SwUndoDrawUnGroupConnectToLayout> -// SdrObject* pObj = rSave.pObj; - -// SwDrawContact *pContact = new SwDrawContact( rSave.pFmt, rSave.pObj ); -// pContact->ConnectToLayout(); -// // --> OD 2005-03-22 #i45718# - follow-up of #i35635# -// // move object to visible layer -// pContact->MoveObjToVisibleLayer( rSave.pObj ); -// // <-- - // <-- - // --> OD 2005-05-10 #i45952# - notify that position attributes - // are already set + // #i45952# - notify that position attributes are already set OSL_ENSURE( rSave.pFmt->ISA(SwDrawFrmFmt), "<SwUndoDrawGroup::Undo(..)> - wrong type of frame format for drawing object" ); if ( rSave.pFmt->ISA(SwDrawFrmFmt) ) { static_cast<SwDrawFrmFmt*>(rSave.pFmt)->PosAttrSet(); } - // <-- } } @@ -502,8 +466,6 @@ void SwUndoDrawUnGroup::AddObj( sal_uInt16 nPos, SwDrawFrmFmt* pFmt ) rSave.pObj = 0; } -//------------------------------------- -// --> OD 2006-11-01 #130889# SwUndoDrawUnGroupConnectToLayout::SwUndoDrawUnGroupConnectToLayout() : SwUndo( UNDO_DRAWUNGROUP ) { @@ -553,7 +515,6 @@ void SwUndoDrawUnGroupConnectToLayout::AddFmtAndObj( SwDrawFrmFmt* pDrawFrmFmt, aDrawFmtsAndObjs.push_back( std::pair< SwDrawFrmFmt*, SdrObject* >( pDrawFrmFmt, pDrawObject ) ); } -// <-- //------------------------------------- @@ -588,12 +549,9 @@ void SwUndoDrawDelete::UndoImpl(::sw::UndoRedoContext & rContext) SdrObject *pObj = rSave.pObj; SwDrawContact *pContact = new SwDrawContact( rSave.pFmt, pObj ); pContact->_Changed( *pObj, SDRUSERCALL_INSERTED, NULL ); - // --> OD 2005-03-22 #i45718# - follow-up of #i35635# - // move object to visible layer + // #i45718# - follow-up of #i35635# move object to visible layer pContact->MoveObjToVisibleLayer( pObj ); - // <-- - // --> OD 2005-05-10 #i45952# - notify that position attributes - // are already set + // #i45952# - notify that position attributes are already set OSL_ENSURE( rSave.pFmt->ISA(SwDrawFrmFmt), "<SwUndoDrawGroup::Undo(..)> - wrong type of frame format for drawing object" ); if ( rSave.pFmt->ISA(SwDrawFrmFmt) ) @@ -615,11 +573,12 @@ void SwUndoDrawDelete::RedoImpl(::sw::UndoRedoContext & rContext) SdrObject *pObj = rSave.pObj; SwDrawContact *pContact = (SwDrawContact*)GetUserCall(pObj); SwDrawFrmFmt *pFmt = (SwDrawFrmFmt*)pContact->GetFmt(); - //loescht sich selbst! + + // object will destroy itself pContact->Changed( *pObj, SDRUSERCALL_DELETE, pObj->GetLastBoundRect() ); pObj->SetUserCall( 0 ); - // alle Uno-Objecte sollten sich jetzt abmelden + // notify UNO objects to decouple ::lcl_SendRemoveToUno( *pFmt ); rFlyFmts.Remove( rFlyFmts.GetPos( pFmt )); @@ -635,10 +594,10 @@ void SwUndoDrawDelete::AddObj( sal_uInt16 , SwDrawFrmFmt* pFmt, rSave.pFmt = pFmt; ::lcl_SaveAnchor( pFmt, rSave.nNodeIdx ); - // alle Uno-Objecte sollten sich jetzt abmelden + // notify UNO objects to decouple ::lcl_SendRemoveToUno( *pFmt ); - // aus dem Array austragen + // remove from array SwDoc* pDoc = pFmt->GetDoc(); SwSpzFrmFmts& rFlyFmts = *(SwSpzFrmFmts*)pDoc->GetSpzFrmFmts(); rFlyFmts.Remove( rFlyFmts.GetPos( pFmt )); diff --git a/sw/source/core/undo/unins.cxx b/sw/source/core/undo/unins.cxx index 4d3fc535d95e..4cb2b0e94b63 100644 --- a/sw/source/core/undo/unins.cxx +++ b/sw/source/core/undo/unins.cxx @@ -1009,7 +1009,7 @@ void SwUndoInsertLabel::RepeatImpl(::sw::RepeatContext & rContext) case LTYPE_OBJECT: { SwFlyFrm* pFly; - SwCntntFrm *pCnt = pCNd->GetFrm(); + SwCntntFrm *pCnt = pCNd->getLayoutFrm( rDoc.GetCurrentLayout() ); if( pCnt && 0 != ( pFly = pCnt->FindFlyFrm() ) ) nIdx = pFly->GetFmt()->GetCntnt().GetCntntIdx()->GetIndex(); } diff --git a/sw/source/core/undo/untbl.cxx b/sw/source/core/undo/untbl.cxx index 16a25e8fcf1e..ee16891ab5e1 100644 --- a/sw/source/core/undo/untbl.cxx +++ b/sw/source/core/undo/untbl.cxx @@ -69,6 +69,7 @@ #include <fmtanchr.hxx> #include <comcore.hrc> #include <unochart.hxx> +#include <switerator.hxx> #if OSL_DEBUG_LEVEL > 1 #define CHECK_TABLE(t) (t).CheckConsistency(); @@ -136,7 +137,7 @@ public: ~_SaveTable(); sal_uInt16 AddFmt( SwFrmFmt* pFmt, bool bIsLine ); - void NewFrmFmt( const SwClient* pLnBx, sal_Bool bIsLine, sal_uInt16 nFmtPos, + void NewFrmFmt( const SwTableLine* , const SwTableBox*, sal_uInt16 nFmtPos, SwFrmFmt* pOldFmt ); void RestoreAttr( SwTable& rTbl, sal_Bool bModifyBox = sal_False ); @@ -492,7 +493,7 @@ void SwUndoTblToTxt::UndoImpl(::sw::UndoRedoContext & rContext) SwTableNode* pTblNd = rDoc.GetNodes().UndoTableToText( nSttNd, nEndNd, *pBoxSaves ); pTblNd->GetTable().SetTableModel( pTblSave->IsNewModel() ); SwTableFmt* pTableFmt = rDoc.MakeTblFrmFmt( sTblNm, rDoc.GetDfltFrmFmt() ); - pTableFmt->Add( &pTblNd->GetTable() ); // das Frame-Format setzen + pTblNd->GetTable().RegisterToFormat( *pTableFmt ); pTblNd->GetTable().SetRowsToRepeat( nHdlnRpt ); // erzeuge die alte Tabellen Struktur @@ -984,12 +985,12 @@ void _SaveTable::RestoreAttr( SwTable& rTbl, sal_Bool bMdfyBox ) } // zur Sicherheit alle Tableframes invalidieren - SwClientIter aIter( *pFmt ); - for( SwClient* pLast = aIter.First( TYPE( SwFrm ) ); pLast; pLast = aIter.Next() ) - if( ((SwTabFrm*)pLast)->GetTable() == &rTbl ) + SwIterator<SwTabFrm,SwFmt> aIter( *pFmt ); + for( SwTabFrm* pLast = aIter.First(); pLast; pLast = aIter.Next() ) + if( pLast->GetTable() == &rTbl ) { - ((SwTabFrm*)pLast)->InvalidateAll(); - ((SwTabFrm*)pLast)->SetCompletePaint(); + pLast->InvalidateAll(); + pLast->SetCompletePaint(); } // FrmFmts mit Defaults (0) fuellen @@ -1121,7 +1122,7 @@ void _SaveTable::CreateNew( SwTable& rTbl, sal_Bool bCreateFrms, } -void _SaveTable::NewFrmFmt( const SwClient* pLnBx, sal_Bool bIsLine, +void _SaveTable::NewFrmFmt( const SwTableLine* pTblLn, const SwTableBox* pTblBx, sal_uInt16 nFmtPos, SwFrmFmt* pOldFmt ) { SwDoc* pDoc = pOldFmt->GetDoc(); @@ -1129,7 +1130,7 @@ void _SaveTable::NewFrmFmt( const SwClient* pLnBx, sal_Bool bIsLine, SwFrmFmt* pFmt = aFrmFmts[ nFmtPos ]; if( !pFmt ) { - if( bIsLine ) + if( pTblLn ) pFmt = pDoc->MakeTableLineFmt(); else pFmt = pDoc->MakeTableBoxFmt(); @@ -1138,16 +1139,16 @@ void _SaveTable::NewFrmFmt( const SwClient* pLnBx, sal_Bool bIsLine, } //Erstmal die Frms ummelden. - SwClientIter aIter( *pOldFmt ); - for( SwClient* pLast = aIter.First( TYPE( SwFrm ) ); pLast; pLast = aIter.Next() ) + SwIterator<SwTabFrm,SwFmt> aIter( *pOldFmt ); + for( SwFrm* pLast = aIter.First(); pLast; pLast = aIter.Next() ) { - if( bIsLine ? pLnBx == ((SwRowFrm*)pLast)->GetTabLine() - : pLnBx == ((SwCellFrm*)pLast)->GetTabBox() ) + if( pTblLn ? ((SwRowFrm*)pLast)->GetTabLine() == pTblLn + : ((SwCellFrm*)pLast)->GetTabBox() == pTblBx ) { - pFmt->Add( pLast ); - ((SwFrm*)pLast)->InvalidateAll(); - ((SwFrm*)pLast)->ReinitializeFrmSizeAttrFlags(); - if ( !bIsLine ) + pLast->RegisterToFormat(*pFmt); + pLast->InvalidateAll(); + pLast->ReinitializeFrmSizeAttrFlags(); + if ( !pTblLn ) { ((SwCellFrm*)pLast)->SetDerivedVert( sal_False ); ((SwCellFrm*)pLast)->CheckDirChange(); @@ -1156,14 +1157,17 @@ void _SaveTable::NewFrmFmt( const SwClient* pLnBx, sal_Bool bIsLine, } //Jetzt noch mich selbst ummelden. - pFmt->Add( (SwClient*)pLnBx ); + if ( pTblLn ) + const_cast<SwTableLine*>(pTblLn)->RegisterToFormat( *pFmt ); + else if ( pTblBx ) + const_cast<SwTableBox*>(pTblBx)->RegisterToFormat( *pFmt ); - if( bModifyBox && !bIsLine ) + if( bModifyBox && !pTblLn ) { const SfxPoolItem& rOld = pOldFmt->GetFmtAttr( RES_BOXATR_FORMAT ), & rNew = pFmt->GetFmtAttr( RES_BOXATR_FORMAT ); if( rOld != rNew ) - pFmt->Modify( (SfxPoolItem*)&rOld, (SfxPoolItem*)&rNew ); + pFmt->ModifyNotification( (SfxPoolItem*)&rOld, (SfxPoolItem*)&rNew ); } if( !pOldFmt->GetDepends() ) @@ -1196,7 +1200,7 @@ _SaveLine::~_SaveLine() void _SaveLine::RestoreAttr( SwTableLine& rLine, _SaveTable& rSTbl ) { - rSTbl.NewFrmFmt( &rLine, sal_True, nItemSet, rLine.GetFrmFmt() ); + rSTbl.NewFrmFmt( &rLine, 0, nItemSet, rLine.GetFrmFmt() ); _SaveBox* pBx = pBox; for( sal_uInt16 n = 0; n < rLine.GetTabBoxes().Count(); ++n, pBx = pBx->pNext ) @@ -1286,7 +1290,7 @@ _SaveBox::~_SaveBox() void _SaveBox::RestoreAttr( SwTableBox& rBox, _SaveTable& rSTbl ) { - rSTbl.NewFrmFmt( &rBox, sal_False, nItemSet, rBox.GetFrmFmt() ); + rSTbl.NewFrmFmt( 0, &rBox, nItemSet, rBox.GetFrmFmt() ); if( ULONG_MAX == nSttNode ) // keine EndBox { @@ -1403,7 +1407,7 @@ void _SaveBox::CreateNew( SwTable& rTbl, SwTableLine& rParent, _SaveTable& rSTbl OSL_ENSURE( pBox, "Wo ist meine TabellenBox geblieben?" ); SwFrmFmt* pOld = pBox->GetFrmFmt(); - pFmt->Add( pBox ); + pBox->RegisterToFormat( *pFmt ); if( !pOld->GetDepends() ) delete pOld; diff --git a/sw/source/core/unocore/unobkm.cxx b/sw/source/core/unocore/unobkm.cxx index f243d93fde2d..d2fc151e5e5c 100644 --- a/sw/source/core/unocore/unobkm.cxx +++ b/sw/source/core/unocore/unobkm.cxx @@ -91,13 +91,13 @@ public: } void registerInMark(SwXBookmark & rThis, ::sw::mark::IMark *const pBkmk); - +protected: // SwClient - virtual void Modify(SfxPoolItem *pOld, SfxPoolItem *pNew); + virtual void Modify( const SfxPoolItem *pOld, const SfxPoolItem *pNew); }; -void SwXBookmark::Impl::Modify(SfxPoolItem *pOld, SfxPoolItem *pNew) +void SwXBookmark::Impl::Modify(const SfxPoolItem *pOld, const SfxPoolItem *pNew) { ClientModify(this, pOld, pNew); if (!GetRegisteredIn()) @@ -596,7 +596,7 @@ uno::Type SwXFieldmarkParameters::getElementType() return !getCoreParameters()->empty(); } -void SwXFieldmarkParameters::Modify(SfxPoolItem *pOld, SfxPoolItem *pNew) +void SwXFieldmarkParameters::Modify(const SfxPoolItem *pOld, const SfxPoolItem *pNew) { ClientModify(this, pOld, pNew); } diff --git a/sw/source/core/unocore/unochart.cxx b/sw/source/core/unocore/unochart.cxx index a727886c5a27..d653e5f782dc 100644 --- a/sw/source/core/unocore/unochart.cxx +++ b/sw/source/core/unocore/unochart.cxx @@ -1545,7 +1545,7 @@ uno::Sequence< OUString > SAL_CALL SwChartDataProvider::getSupportedServiceNames return aRes; } -void SwChartDataProvider::Modify( SfxPoolItem *pOld, SfxPoolItem *pNew) +void SwChartDataProvider::Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew) { // actually this function should be superfluous (need to check later) ClientModify(this, pOld, pNew ); @@ -2389,7 +2389,7 @@ uno::Sequence< OUString > SAL_CALL SwChartDataSequence::getSupportedServiceNames return aRes; } -void SwChartDataSequence::Modify( SfxPoolItem *pOld, SfxPoolItem *pNew) +void SwChartDataSequence::Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew) { ClientModify(this, pOld, pNew ); diff --git a/sw/source/core/unocore/unocoll.cxx b/sw/source/core/unocore/unocoll.cxx index 5b96e7247070..e5db9e65f472 100644 --- a/sw/source/core/unocore/unocoll.cxx +++ b/sw/source/core/unocore/unocoll.cxx @@ -71,13 +71,13 @@ #include <comphelper/sequence.hxx> #include <list> #include <iterator> - #include <unosection.hxx> #include <unoparagraph.hxx> #include <unobookmark.hxx> #include <unorefmark.hxx> #include <unometa.hxx> #include "docsh.hxx" +#include <switerator.hxx> #include <com/sun/star/document/XCodeNameQuery.hpp> #include <com/sun/star/drawing/XDrawPageSupplier.hpp> #include <com/sun/star/form/XFormsSupplier.hpp> @@ -790,8 +790,7 @@ uno::Reference< uno::XInterface > SwXServiceProvider::MakeInstance(sal_uInt16 } else { - SwClientIter aIter( *pType ); - SwXFieldMaster* pMaster = (SwXFieldMaster*)aIter.First( TYPE( SwXFieldMaster )); + SwXFieldMaster* pMaster = SwIterator<SwXFieldMaster,SwFieldType>::FirstElement( *pType ); if(pMaster) xRet = (cppu::OWeakObject*)pMaster; } @@ -997,8 +996,7 @@ uno::Sequence< OUString > SwXTextTables::getSupportedServiceNames(void) throw( u XTextTable* SwXTextTables::GetObject( SwFrmFmt& rFmt ) { SolarMutexGuard aGuard; - SwXTextTable* pTbl = (SwXTextTable*)SwClientIter( rFmt ). - First( TYPE( SwXTextTable )); + SwXTextTable* pTbl = SwIterator<SwXTextTable,SwFmt>::FirstElement( rFmt ); if( !pTbl ) pTbl = new SwXTextTable(rFmt); return pTbl ; @@ -1038,7 +1036,7 @@ namespace template<FlyCntType T> static uno::Any lcl_UnoWrapFrame(SwFrmFmt* pFmt) { - SwXFrame* pFrm = static_cast<SwXFrame*>(SwClientIter(*pFmt).First(TYPE(SwXFrame))); + SwXFrame* pFrm = SwIterator<SwXFrame,SwFmt>::FirstElement( *pFmt ); if(!pFrm) pFrm = new typename UnoFrameWrap_traits<T>::core_frame_t(*pFmt); Reference< typename UnoFrameWrap_traits<T>::uno_frame_t > xFrm = @@ -1306,7 +1304,7 @@ sal_Bool SwXFrames::hasElements(void) throw(uno::RuntimeException) SwXFrame* SwXFrames::GetObject(SwFrmFmt& rFmt, FlyCntType eType) { - SwXFrame* pFrm = (SwXFrame*)SwClientIter(rFmt).First(TYPE(SwXFrame)); + SwXFrame* pFrm = SwIterator<SwXFrame,SwFmt>::FirstElement( rFmt ); if(pFrm) return pFrm; switch(eType) { @@ -1354,7 +1352,6 @@ SwXTextFrames::~SwXTextFrames() /****************************************************************** * SwXTextGraphicObjects ******************************************************************/ -//SMART_UNO_IMPLEMENTATION( SwXTextGraphicObjects, UsrObject ); OUString SwXTextGraphicObjects::getImplementationName(void) throw( RuntimeException ) { return C2U("SwXTextGraphicObjects"); @@ -1413,7 +1410,6 @@ SwXTextEmbeddedObjects::~SwXTextEmbeddedObjects() } #define PASSWORD_STD_TIMEOUT 1000 - OUString SwXTextSections::getImplementationName(void) throw( RuntimeException ) { return C2U("SwXTextSections"); @@ -1990,9 +1986,7 @@ SwXReferenceMark* SwXReferenceMarks::GetObject( SwDoc* pDoc, const SwFmtRefMark* return SwXReferenceMark::CreateXReferenceMark(*pDoc, *pMark); } -/*-------------------------------------------------- - Gueltigkeitspruefung ---------------------------------------------------*/ + void SwUnoCollection::Invalidate() { bObjectValid = sal_False; diff --git a/sw/source/core/unocore/unocrsrhelper.cxx b/sw/source/core/unocore/unocrsrhelper.cxx index ad9c05593c95..c542798bdc8e 100644 --- a/sw/source/core/unocore/unocrsrhelper.cxx +++ b/sw/source/core/unocore/unocrsrhelper.cxx @@ -361,7 +361,7 @@ sal_Bool getCrsrPropertyValue(const SfxItemPropertySimpleEntry& rEntry { if( pAny ) { - SwXTextField* pField = CreateSwXTextField(*rPam.GetDoc(), + SwXTextField* pField = SwXTextField::CreateSwXTextField(*rPam.GetDoc(), pTxtAttr->GetFld()); *pAny <<= uno::Reference< XTextField >( pField ); } @@ -728,7 +728,7 @@ void getNumberingProperty(SwPaM& rPam, PropertyState& eState, Any * pAny ) void GetCurPageStyle(SwPaM& rPaM, String &rString) { - const SwPageFrm* pPage = rPaM.GetCntntNode()->GetFrm()->FindPageFrm(); + const SwPageFrm* pPage = rPaM.GetCntntNode()->getLayoutFrm(rPaM.GetDoc()->GetCurrentLayout())->FindPageFrm(); if(pPage) SwStyleNameMapper::FillProgName( pPage->GetPageDesc()->GetName(), rString, nsSwGetPoolIdFromName::GET_POOLID_PAGEDESC, sal_True ); } diff --git a/sw/source/core/unocore/unodraw.cxx b/sw/source/core/unocore/unodraw.cxx index aaa58b411b14..d709de046f76 100644 --- a/sw/source/core/unocore/unodraw.cxx +++ b/sw/source/core/unocore/unodraw.cxx @@ -62,7 +62,6 @@ #include <fmtornt.hxx> #include <fmtanchr.hxx> #include <fmtsrnd.hxx> -// #i26791# #include <fmtfollowtextflow.hxx> #include <rootfrm.hxx> #include <editeng/lrspitem.hxx> @@ -88,6 +87,7 @@ #include <vcl/svapp.hxx> #include <list> #include <iterator> +#include <switerator.hxx> using ::rtl::OUString; using namespace ::com::sun::star; @@ -317,8 +317,7 @@ uno::Reference< uno::XInterface > SwFmDrawPage::GetInterface( SdrObject* pObj if( pObj ) { SwFrmFmt* pFmt = ::FindFrmFmt( pObj ); - SwXShape* pxShape = (SwXShape*)SwClientIter( *pFmt ). - First( TYPE( SwXShape )); + SwXShape* pxShape = SwIterator<SwXShape,SwFmt>::FirstElement( *pFmt ); if(pxShape) { xShape = *(cppu::OWeakObject*)pxShape; @@ -732,11 +731,11 @@ void SwXDrawPage::add(const uno::Reference< drawing::XShape > & xShape) else throw uno::RuntimeException(); } - else if ((aAnchor.GetAnchorId() != FLY_AT_PAGE) && pDoc->GetRootFrm()) + else if ((aAnchor.GetAnchorId() != FLY_AT_PAGE) && pDoc->GetCurrentLayout()) { SwCrsrMoveState aState( MV_SETONLYTEXT ); Point aTmp(MM100_TO_TWIP(aMM100Pos.X), MM100_TO_TWIP(aMM100Pos.Y)); - pDoc->GetRootFrm()->GetCrsrOfst( pPam->GetPoint(), aTmp, &aState ); + pDoc->GetCurrentLayout()->GetCrsrOfst( pPam->GetPoint(), aTmp, &aState ); //swmod 080218 aAnchor.SetAnchor( pPam->GetPoint() ); // #i32349# - adjustment of vertical positioning @@ -922,6 +921,7 @@ namespace } } + SwXShape::SwXShape(uno::Reference< uno::XInterface > & xShape) : m_pPropSet(aSwMapProvider.GetPropertySet(PROPERTY_MAP_TEXT_SHAPE)), m_pPropertyMapEntries(aSwMapProvider.GetPropertyMapEntries(PROPERTY_MAP_TEXT_SHAPE)), @@ -1261,7 +1261,7 @@ void SwXShape::setPropertyValue(const rtl::OUString& rPropertyName, const uno::A aValue >>= nPositionLayoutDir; pFmt->SetPositionLayoutDir( nPositionLayoutDir ); } - else if( pDoc->GetRootFrm() ) + else if( pDoc->GetCurrentLayout()) //swmod 080218 { UnoActionContext aCtx(pDoc); if(RES_ANCHOR == pEntry->nWID && MID_ANCHOR_ANCHORTYPE == pEntry->nMemberId) @@ -1326,11 +1326,11 @@ void SwXShape::setPropertyValue(const rtl::OUString& rPropertyName, const uno::A //if the fly has been anchored at page then it needs to be connected //to the content position SwPaM aPam(pDoc->GetNodes().GetEndOfContent()); - if( pDoc->GetRootFrm() ) + if( pDoc->GetCurrentLayout() ) { SwCrsrMoveState aState( MV_SETONLYTEXT ); Point aTmp( pObj->GetSnapRect().TopLeft() ); - pDoc->GetRootFrm()->GetCrsrOfst( aPam.GetPoint(), aTmp, &aState ); + pDoc->GetCurrentLayout()->GetCrsrOfst( aPam.GetPoint(), aTmp, &aState ); } else { @@ -1443,7 +1443,7 @@ void SwXShape::setPropertyValue(const rtl::OUString& rPropertyName, const uno::A { aKeepedPosition = getPosition(); } - if( pFmt && pFmt->GetDoc()->GetRootFrm() ) + if( pFmt && pFmt->GetDoc()->GetCurrentViewShell() ) //swmod 071108//swmod 071225 { UnoActionContext aCtx(pFmt->GetDoc()); xPrSet->setPropertyValue(rPropertyName, aValue); @@ -1680,9 +1680,6 @@ uno::Any SwXShape::getPropertyValue(const rtl::OUString& rPropertyName) return aRet; } -/** method to get property from aggregation object - #i36248# -*/ uno::Any SwXShape::_getPropAtAggrObj( const ::rtl::OUString& _rPropertyName ) throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException ) @@ -1962,7 +1959,7 @@ void SwXShape::removeVetoableChangeListener( DBG_WARNING("not implemented"); } -void SwXShape::Modify( SfxPoolItem *pOld, SfxPoolItem *pNew) +void SwXShape::Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew) { ClientModify(this, pOld, pNew); } diff --git a/sw/source/core/unocore/unofield.cxx b/sw/source/core/unocore/unofield.cxx index 34d473ee4199..93126e71ab9d 100644 --- a/sw/source/core/unocore/unofield.cxx +++ b/sw/source/core/unocore/unofield.cxx @@ -94,6 +94,7 @@ #include <editeng/outliner.hxx> #include <docsh.hxx> #include <fmtmeta.hxx> // MetaFieldManager +#include <switerator.hxx> using ::rtl::OUString; using namespace ::com::sun::star; @@ -749,21 +750,22 @@ uno::Any SwXFieldMaster::getPropertyValue(const OUString& rPropertyName) else if(rPropertyName.equalsAsciiL( SW_PROP_NAME(UNO_NAME_DEPENDENT_TEXT_FIELDS)) ) { //fill all text fields into a sequence - SwClientIter aIter( *pType ); SwDependentFields aFldArr; - SwFmtFldPtr pFld = (SwFmtFld*)aIter.First( TYPE( SwFmtFld )); + SwIterator<SwFmtFld,SwFieldType> aIter( *pType ); + SwFmtFldPtr pFld = aIter.First(); while(pFld) { if(pFld->IsFldInDoc()) aFldArr.Insert(pFld, aFldArr.Count()); - pFld = (SwFmtFld*)aIter.Next(); + pFld = aIter.Next(); } + uno::Sequence<uno::Reference <text::XDependentTextField> > aRetSeq(aFldArr.Count()); uno::Reference<text::XDependentTextField>* pRetSeq = aRetSeq.getArray(); for(sal_uInt16 i = 0; i < aFldArr.Count(); i++) { pFld = aFldArr.GetObject(i); - SwXTextField * pInsert = CreateSwXTextField(*GetDoc(), *pFld); + SwXTextField * pInsert = SwXTextField::CreateSwXTextField(*GetDoc(), *pFld); pRetSeq[i] = uno::Reference<text::XDependentTextField>(pInsert); } @@ -913,8 +915,8 @@ void SwXFieldMaster::dispose(void) throw( uno::RuntimeException ) } // zuerst alle Felder loeschen - SwClientIter aIter( *pFldType ); - SwFmtFld* pFld = (SwFmtFld*)aIter.First( TYPE( SwFmtFld )); + SwIterator<SwFmtFld,SwFieldType> aIter( *pFldType ); + SwFmtFld* pFld = aIter.First(); while(pFld) { // Feld im Undo? @@ -927,7 +929,7 @@ void SwXFieldMaster::dispose(void) throw( uno::RuntimeException ) aPam.Move(); GetDoc()->DeleteAndJoin(aPam); } - pFld = (SwFmtFld*)aIter.Next(); + pFld = aIter.Next(); } // dann den FieldType loeschen GetDoc()->RemoveFldType(nTypeIdx); @@ -951,7 +953,7 @@ void SwXFieldMaster::removeEventListener(const uno::Reference< lang::XEventListe throw uno::RuntimeException(); } -void SwXFieldMaster::Modify( SfxPoolItem *pOld, SfxPoolItem *pNew) +void SwXFieldMaster::Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew) { ClientModify(this, pOld, pNew); if(!GetRegisteredIn()) @@ -960,7 +962,6 @@ void SwXFieldMaster::Modify( SfxPoolItem *pOld, SfxPoolItem *pNew) m_pDoc = 0; } } - OUString SwXFieldMaster::GetProgrammaticName(const SwFieldType& rType, SwDoc& rDoc) { OUString sRet(rType.GetName()); @@ -1000,12 +1001,11 @@ OUString SwXFieldMaster::LocalizeFormula( return rFormula; } -SwXTextField * CreateSwXTextField(SwDoc & rDoc, SwFmtFld const& rFmt) +SwXTextField* SwXTextField::CreateSwXTextField(SwDoc & rDoc, SwFmtFld const& rFmt) { - SwClientIter aIter(*rFmt.GetFld()->GetTyp()); + SwIterator<SwXTextField,SwFieldType> aIter(*rFmt.GetFld()->GetTyp()); SwXTextField * pField = 0; - SwXTextField * pTemp = - static_cast<SwXTextField*>(aIter.First( TYPE(SwXTextField) )); + SwXTextField * pTemp = aIter.First(); while (pTemp) { if (pTemp->GetFldFmt() == &rFmt) @@ -1013,7 +1013,7 @@ SwXTextField * CreateSwXTextField(SwDoc & rDoc, SwFmtFld const& rFmt) pField = pTemp; break; } - pTemp = static_cast<SwXTextField*>(aIter.Next()); + pTemp = aIter.Next(); } return pField ? pField : new SwXTextField( rFmt, &rDoc ); } @@ -1168,8 +1168,8 @@ uno::Reference< beans::XPropertySet > SwXTextField::getTextFieldMaster(void) th throw uno::RuntimeException(); pType = pFmtFld->GetFld()->GetTyp(); } - SwXFieldMaster* pMaster = (SwXFieldMaster*) - SwClientIter(*pType).First(TYPE(SwXFieldMaster)); + + SwXFieldMaster* pMaster = SwIterator<SwXFieldMaster,SwFieldType>::FirstElement( *pType ); if(!pMaster) pMaster = new SwXFieldMaster(*pType, GetDoc()); @@ -2265,7 +2265,7 @@ void SwXTextField::update( ) throw (uno::RuntimeException) break; } // Text formatting has to be triggered. - const_cast<SwFmtFld*>(pFmtFld)->Modify( 0, 0 ); + const_cast<SwFmtFld*>(pFmtFld)->ModifyNotification( 0, 0 ); } else m_bCallUpdate = sal_True; @@ -2334,7 +2334,8 @@ void SwXTextField::Invalidate() } } -void SwXTextField::Modify( SfxPoolItem *pOld, SfxPoolItem *pNew) + +void SwXTextField::Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew) { switch( pOld ? pOld->Which() : 0 ) { @@ -2466,8 +2467,7 @@ uno::Any SwXTextFieldMasters::getByName(const OUString& rName) SwFieldType* pType = GetDoc()->GetFldType(nResId, sName, sal_True); if(!pType) throw container::NoSuchElementException(); - SwXFieldMaster* pMaster = (SwXFieldMaster*) - SwClientIter(*pType).First(TYPE(SwXFieldMaster)); + SwXFieldMaster* pMaster = SwIterator<SwXFieldMaster,SwFieldType>::FirstElement( *pType ); if(!pMaster) pMaster = new SwXFieldMaster(*pType, GetDoc()); uno::Reference< beans::XPropertySet > aRef = pMaster; @@ -2717,9 +2717,8 @@ SwXFieldEnumeration::SwXFieldEnumeration(SwDoc* pDc) : for(sal_uInt16 nType = 0; nType < nCount; ++nType) { const SwFieldType *pCurType = pFldTypes->GetObject(nType); - - SwClientIter aIter( *(SwFieldType*)pCurType ); - const SwFmtFld* pCurFldFmt = (SwFmtFld*)aIter.First( TYPE( SwFmtFld )); + SwIterator<SwFmtFld,SwFieldType> aIter( *pCurType ); + const SwFmtFld* pCurFldFmt = aIter.First(); while (pCurFldFmt) { const SwTxtFld *pTxtFld = pCurFldFmt->GetTxtFld(); @@ -2729,7 +2728,7 @@ SwXFieldEnumeration::SwXFieldEnumeration(SwDoc* pDc) : !pTxtFld->GetpTxtNode()->GetNodes().IsDocNodes(); if (!bSkip) pItems[ nFillPos++ ] = new SwXTextField(*pCurFldFmt, pDoc); - pCurFldFmt = (SwFmtFld*)aIter.Next(); + pCurFldFmt = aIter.Next(); // enlarge sequence if necessary if (aItems.getLength() == nFillPos) @@ -2789,7 +2788,7 @@ uno::Any SwXFieldEnumeration::nextElement(void) return aRet; } -void SwXFieldEnumeration::Modify( SfxPoolItem *pOld, SfxPoolItem *pNew) +void SwXFieldEnumeration::Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew) { ClientModify(this, pOld, pNew); if(!GetRegisteredIn()) diff --git a/sw/source/core/unocore/unoflatpara.cxx b/sw/source/core/unocore/unoflatpara.cxx index 97e92598e38a..17538a119b35 100644 --- a/sw/source/core/unocore/unoflatpara.cxx +++ b/sw/source/core/unocore/unoflatpara.cxx @@ -308,7 +308,7 @@ SwXFlatParagraphIterator::~SwXFlatParagraphIterator() } -void SwXFlatParagraphIterator::Modify( SfxPoolItem *pOld, SfxPoolItem *pNew ) +void SwXFlatParagraphIterator::Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew ) { ClientModify( this, pOld, pNew ); // check if document gets closed... @@ -388,7 +388,7 @@ uno::Reference< text::XFlatParagraph > SwXFlatParagraphIterator::getNextPara() if ( !pCurrentPage && !pStopPage ) { pStopPage = pStartPage; - pCurrentPage = static_cast<SwPageFrm*>(mpDoc->GetRootFrm()->Lower()); + pCurrentPage = static_cast<SwPageFrm*>(pViewShell->GetLayout()->Lower()); } } } diff --git a/sw/source/core/unocore/unoframe.cxx b/sw/source/core/unocore/unoframe.cxx index 93b80196d9ef..e23cf3c9d4eb 100644 --- a/sw/source/core/unocore/unoframe.cxx +++ b/sw/source/core/unocore/unoframe.cxx @@ -114,12 +114,10 @@ #include <com/sun/star/style/XStyleFamiliesSupplier.hpp> #include <tools/urlobj.hxx> #include <editeng/frmdiritem.hxx> -// DVO, OD 01.10.2003 #i18732# #include <fmtfollowtextflow.hxx> -// OD 2004-05-05 #i28701# #include <fmtwrapinfluenceonobjpos.hxx> - #include <toolkit/helper/vclunohelper.hxx> +#include <switerator.hxx> // from fefly1.cxx extern sal_Bool lcl_ChkAndSetNewAnchor( const SwFlyFrm& rFly, SfxItemSet& rSet ); @@ -748,9 +746,6 @@ uno::Sequence< OUString > SwXFrame::getSupportedServiceNames(void) throw( uno::R return aRet; } -/*----------------------------------------------------------------------- - Dieser CTor legt den Frame als Descriptor an - -----------------------------------------------------------------------*/ SwXFrame::SwXFrame(FlyCntType eSet, const :: SfxItemPropertySet* pSet, SwDoc *pDoc) : aLstnrCntnr( (container::XNamed*)this), m_pPropSet(pSet), @@ -1637,11 +1632,9 @@ uno::Any SwXFrame::getPropertyValue(const OUString& rPropertyName) // format document completely in order to get correct value pFmt->GetDoc()->GetEditShell()->CalcLayout(); - SwClientIter aIter( *pFmt ); - SwClient* pC = aIter.First( TYPE( SwFrm ) ); - if (pC) + SwFrm* pTmpFrm = SwIterator<SwFrm,SwFmt>::FirstElement( *pFmt ); + if ( pTmpFrm ) { - SwFrm *pTmpFrm = static_cast< SwFrm * >(pC); DBG_ASSERT( pTmpFrm->IsValid(), "frame not valid" ); const SwRect &rRect = pTmpFrm->Frm(); Size aMM100Size = OutputDevice::LogicToLogic( @@ -1913,7 +1906,7 @@ void SwXFrame::removeEventListener(const uno::Reference< lang::XEventListener > throw uno::RuntimeException(); } -void SwXFrame::Modify( SfxPoolItem *pOld, SfxPoolItem *pNew) +void SwXFrame::Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew) { ClientModify(this, pOld, pNew); if(!GetRegisteredIn()) @@ -2827,7 +2820,6 @@ SwXTextEmbeddedObject::~SwXTextEmbeddedObject() { } - void SAL_CALL SwXTextEmbeddedObject::acquire()throw() { SwXFrame::acquire(); @@ -2933,9 +2925,7 @@ uno::Reference< lang::XComponent > SwXTextEmbeddedObject::getEmbeddedObject(voi uno::Reference< frame::XModel > xModel( xRet, uno::UNO_QUERY); if( xBrdcst.is() && xModel.is() ) { - SwClientIter aIter( *pFmt ); - SwXOLEListener* pListener = (SwXOLEListener*)aIter. - First( TYPE( SwXOLEListener )); + SwXOLEListener* pListener = SwIterator<SwXOLEListener,SwFmt>::FirstElement( *pFmt ); //create a new one if the OLE object doesn't have one already if( !pListener ) { @@ -2975,9 +2965,7 @@ uno::Reference< embed::XEmbeddedObject > SAL_CALL SwXTextEmbeddedObject::getExte uno::Reference< frame::XModel > xModel( xComp, uno::UNO_QUERY); if( xBrdcst.is() && xModel.is() ) { - SwClientIter aIter( *pFmt ); - SwXOLEListener* pListener = (SwXOLEListener*)aIter. - First( TYPE( SwXOLEListener )); + SwXOLEListener* pListener = SwIterator<SwXOLEListener,SwFmt>::FirstElement( *pFmt ); //create a new one if the OLE object doesn't have one already if( !pListener ) { @@ -3041,6 +3029,7 @@ uno::Reference< graphic::XGraphic > SAL_CALL SwXTextEmbeddedObject::getReplaceme return uno::Reference< graphic::XGraphic >(); } + OUString SwXTextEmbeddedObject::getImplementationName(void) throw( uno::RuntimeException ) { @@ -3145,7 +3134,7 @@ void SwXOLEListener::disposing( const lang::EventObject& rEvent ) } } -void SwXOLEListener::Modify( SfxPoolItem* pOld, SfxPoolItem* pNew ) +void SwXOLEListener::Modify( const SfxPoolItem* pOld, const SfxPoolItem* pNew ) { ClientModify(this, pOld, pNew); if(!GetRegisteredIn()) diff --git a/sw/source/core/unocore/unoftn.cxx b/sw/source/core/unocore/unoftn.cxx index cae953c93edb..529530932cb7 100644 --- a/sw/source/core/unocore/unoftn.cxx +++ b/sw/source/core/unocore/unoftn.cxx @@ -99,9 +99,9 @@ public: } void Invalidate(); - +protected: // SwClient - virtual void Modify(SfxPoolItem *pOld, SfxPoolItem *pNew); + virtual void Modify( const SfxPoolItem *pOld, const SfxPoolItem *pNew); }; @@ -116,7 +116,7 @@ void SwXFootnote::Impl::Invalidate() m_rThis.SetDoc(0); } -void SwXFootnote::Impl::Modify(SfxPoolItem *pOld, SfxPoolItem *pNew) +void SwXFootnote::Impl::Modify(const SfxPoolItem *pOld, const SfxPoolItem *pNew) { ClientModify(this, pOld, pNew); @@ -130,7 +130,7 @@ void SwXFootnote::Impl::Modify(SfxPoolItem *pOld, SfxPoolItem *pNew) { case RES_FOOTNOTE_DELETED: if (static_cast<const void*>(m_pFmtFtn) == - static_cast<SwPtrMsgPoolItem *>(pOld)->pObject) + static_cast<const SwPtrMsgPoolItem *>(pOld)->pObject) { Invalidate(); } diff --git a/sw/source/core/unocore/unoidx.cxx b/sw/source/core/unocore/unoidx.cxx index 57eb3486ef7a..50524cfc788d 100644 --- a/sw/source/core/unocore/unoidx.cxx +++ b/sw/source/core/unocore/unoidx.cxx @@ -141,8 +141,8 @@ lcl_ReAssignTOXType(SwDoc* pDoc, SwTOXBase& rTOXBase, const OUString& rNewName) SwTOXType aNewType(TOX_USER, rNewName); pNewType = pDoc->InsertTOXType( aNewType ); } - //has to be non-const-casted - ((SwTOXType*)pNewType)->Add(&rTOXBase); + + rTOXBase.RegisterToTOXType( *((SwTOXType*)pNewType) ); } static const char cUserDefined[] = "User-Defined"; @@ -385,13 +385,13 @@ public: ? SwForm::GetFormMaxLevel(m_eTOXType) : rSection.GetTOXForm().GetFormMax(); } - +protected: // SwClient - virtual void Modify(SfxPoolItem *pOld, SfxPoolItem *pNew); + virtual void Modify(const SfxPoolItem *pOld, const SfxPoolItem *pNew); }; -void SwXDocumentIndex::Impl::Modify(SfxPoolItem *pOld, SfxPoolItem *pNew) +void SwXDocumentIndex::Impl::Modify(const SfxPoolItem *pOld, const SfxPoolItem *pNew) { ClientModify(this, pOld, pNew); @@ -1190,25 +1190,13 @@ throw (beans::UnknownPropertyException, lang::WrappedTargetException, case WID_INDEX_MARKS: { SwTOXMarks aMarks; - SwTOXType const*const pType = pTOXBase->GetTOXType(); - SwClientIter aIter(*pType); - SwTOXMark * pMark = - static_cast<SwTOXMark*>(aIter.First(TYPE(SwTOXMark))); - while( pMark ) - { - if(pMark->GetTxtTOXMark()) - { - aMarks.C40_INSERT(SwTOXMark, pMark, aMarks.Count()); - } - pMark = static_cast<SwTOXMark*>(aIter.Next()); - } - uno::Sequence< uno::Reference<text::XDocumentIndexMark> > - aXMarks(aMarks.Count()); - uno::Reference<text::XDocumentIndexMark>* pxMarks = - aXMarks.getArray(); + const SwTOXType* pType = pTOXBase->GetTOXType(); + SwTOXMark::InsertTOXMarks( aMarks, *pType ); + uno::Sequence< uno::Reference<text::XDocumentIndexMark> > aXMarks(aMarks.Count()); + uno::Reference<text::XDocumentIndexMark>* pxMarks = aXMarks.getArray(); for(sal_uInt16 i = 0; i < aMarks.Count(); i++) { - pMark = aMarks.GetObject(i); + SwTOXMark* pMark = aMarks.GetObject(i); pxMarks[i] = SwXDocumentIndexMark::CreateXDocumentIndexMark( *m_pImpl->m_pDoc, *const_cast<SwTOXType*>(pType), *pMark); @@ -1580,9 +1568,9 @@ public: } void Invalidate(); - +protected: // SwClient - virtual void Modify(SfxPoolItem *pOld, SfxPoolItem *pNew); + virtual void Modify(const SfxPoolItem *pOld, const SfxPoolItem *pNew); }; void SwXDocumentIndexMark::Impl::Invalidate() @@ -1604,7 +1592,7 @@ void SwXDocumentIndexMark::Impl::Invalidate() m_pTOXMark = 0; } -void SwXDocumentIndexMark::Impl::Modify(SfxPoolItem *pOld, SfxPoolItem *pNew) +void SwXDocumentIndexMark::Impl::Modify(const SfxPoolItem *pOld, const SfxPoolItem *pNew) { ClientModify(this, pOld, pNew); diff --git a/sw/source/core/unocore/unoobj.cxx b/sw/source/core/unocore/unoobj.cxx index 0948ddadcbae..c73b565cc18e 100644 --- a/sw/source/core/unocore/unoobj.cxx +++ b/sw/source/core/unocore/unoobj.cxx @@ -378,7 +378,7 @@ SwUnoCursorHelper::SetPageDesc( { throw lang::IllegalArgumentException(); } - pPageDesc->Add( pNewDesc.get() ); + pNewDesc.get()->RegisterToPageDesc( *pPageDesc ); bPut = sal_True; } if(!bPut) @@ -795,13 +795,13 @@ public: m_bIsDisposed = true; m_ListenerContainer.Disposing(); } - +protected: // SwClient - virtual void Modify(SfxPoolItem *pOld, SfxPoolItem *pNew); + virtual void Modify(const SfxPoolItem *pOld, const SfxPoolItem *pNew); }; -void SwXTextCursor::Impl::Modify(SfxPoolItem *pOld, SfxPoolItem *pNew) +void SwXTextCursor::Impl::Modify(const SfxPoolItem *pOld, const SfxPoolItem *pNew) { ClientModify(this, pOld, pNew); diff --git a/sw/source/core/unocore/unoobj2.cxx b/sw/source/core/unocore/unoobj2.cxx index b64d3141f32a..ce0f313349e5 100644 --- a/sw/source/core/unocore/unoobj2.cxx +++ b/sw/source/core/unocore/unoobj2.cxx @@ -118,16 +118,13 @@ #include <dcontact.hxx> #include <dflyobj.hxx> #include <crsskip.hxx> -// OD 2004-05-07 #i28701# #include <vector> -// OD 2004-05-24 #i28701# #include <sortedobjs.hxx> #include <sortopt.hxx> - #include <algorithm> #include <iterator> #include <boost/bind.hpp> - +#include <switerator.hxx> using namespace ::com::sun::star; using ::rtl::OUString; @@ -212,9 +209,9 @@ void CollectFrameAtNode( SwClient& rClnt, const SwNodeIndex& rIdx, ? FLY_AT_CHAR : FLY_AT_PARA); const SwCntntFrm* pCFrm; const SwCntntNode* pCNd; - if( pDoc->GetRootFrm() && + if( pDoc->GetCurrentViewShell() && //swmod 071108//swmod 071225 0 != (pCNd = rIdx.GetNode().GetCntntNode()) && - 0 != (pCFrm = pCNd->GetFrm()) ) + 0 != (pCFrm = pCNd->getLayoutFrm( pDoc->GetCurrentLayout())) ) { const SwSortedObjs *pObjs = pCFrm->GetDrawObjs(); if( pObjs ) @@ -272,7 +269,7 @@ void CollectFrameAtNode( SwClient& rClnt, const SwNodeIndex& rIdx, UnoActionContext::UnoActionContext(SwDoc *const pDoc) : m_pDoc(pDoc) { - SwRootFrm *const pRootFrm = m_pDoc->GetRootFrm(); + SwRootFrm *const pRootFrm = m_pDoc->GetCurrentLayout(); if (pRootFrm) { pRootFrm->StartAllAction(); @@ -284,7 +281,7 @@ UnoActionContext::~UnoActionContext() // Doc may already have been removed here if (m_pDoc) { - SwRootFrm *const pRootFrm = m_pDoc->GetRootFrm(); + SwRootFrm *const pRootFrm = m_pDoc->GetCurrentLayout(); if (pRootFrm) { pRootFrm->EndAllAction(); @@ -298,7 +295,7 @@ UnoActionContext::~UnoActionContext() UnoActionRemoveContext::UnoActionRemoveContext(SwDoc *const pDoc) : m_pDoc(pDoc) { - SwRootFrm *const pRootFrm = m_pDoc->GetRootFrm(); + SwRootFrm *const pRootFrm = m_pDoc->GetCurrentLayout(); if (pRootFrm) { pRootFrm->UnoRemoveAllActions(); @@ -307,14 +304,14 @@ UnoActionRemoveContext::UnoActionRemoveContext(SwDoc *const pDoc) UnoActionRemoveContext::~UnoActionRemoveContext() { - SwRootFrm *const pRootFrm = m_pDoc->GetRootFrm(); + SwRootFrm *const pRootFrm = m_pDoc->GetCurrentLayout(); if (pRootFrm) { pRootFrm->UnoRestoreAllActions(); } } -void ClientModify(SwClient* pClient, SfxPoolItem *pOld, SfxPoolItem *pNew) +void ClientModify(SwClient* pClient, const SfxPoolItem *pOld, const SfxPoolItem *pNew) { switch( pOld ? pOld->Which() : 0 ) { @@ -517,13 +514,13 @@ public: uno::Reference< text::XTextContent > NextElement_Impl() throw (container::NoSuchElementException, lang::WrappedTargetException, uno::RuntimeException); - +protected: // SwClient - virtual void Modify(SfxPoolItem *pOld, SfxPoolItem *pNew); + virtual void Modify( const SfxPoolItem *pOld, const SfxPoolItem *pNew); }; -void SwXParagraphEnumeration::Impl::Modify(SfxPoolItem *pOld, SfxPoolItem *pNew) +void SwXParagraphEnumeration::Impl::Modify( const SfxPoolItem *pOld, const SfxPoolItem *pNew) { ClientModify(this, pOld, pNew); } @@ -786,13 +783,13 @@ public: } const ::sw::mark::IMark * GetBookmark() const { return m_pMark; } - +protected: // SwClient - virtual void Modify(SfxPoolItem *pOld, SfxPoolItem *pNew); + virtual void Modify(const SfxPoolItem *pOld, const SfxPoolItem *pNew); }; -void SwXTextRange::Impl::Modify(SfxPoolItem *pOld, SfxPoolItem *pNew) +void SwXTextRange::Impl::Modify(const SfxPoolItem *pOld, const SfxPoolItem *pNew) { const bool bAlreadyRegistered = 0 != GetRegisteredIn(); ClientModify(this, pOld, pNew); @@ -1227,8 +1224,7 @@ CreateParentXText(SwDoc & rDoc, const SwPosition& rPos) SwFrmFmt *const pFmt = pSttNode->GetFlyFmt(); if (0 != pFmt) { - SwXTextFrame* pFrame( static_cast<SwXTextFrame*>( - SwClientIter( *pFmt ).First( TYPE( SwXTextFrame ) ) ) ); + SwXTextFrame* pFrame = SwIterator<SwXTextFrame,SwFmt>::FirstElement( *pFmt ); xParentText = pFrame ? pFrame : new SwXTextFrame( *pFmt ); } } @@ -1579,13 +1575,13 @@ public: } void MakeRanges(); - +protected: // SwClient - virtual void Modify(SfxPoolItem *pOld, SfxPoolItem *pNew); + virtual void Modify( const SfxPoolItem *pOld, const SfxPoolItem *pNew); }; -void SwXTextRanges::Impl::Modify(SfxPoolItem *pOld, SfxPoolItem *pNew) +void SwXTextRanges::Impl::Modify( const SfxPoolItem *pOld, const SfxPoolItem *pNew) { ClientModify(this, pOld, pNew); } @@ -1762,9 +1758,9 @@ public: return static_cast<SwUnoCrsr*>( const_cast<SwModify*>(GetRegisteredIn())); } - +protected: // SwClient - virtual void Modify(SfxPoolItem *pOld, SfxPoolItem *pNew); + virtual void Modify( const SfxPoolItem *pOld, const SfxPoolItem *pNew); }; @@ -1773,7 +1769,7 @@ struct InvalidFrameDepend { { return !rEntry->GetRegisteredIn(); } }; -void SwXParaFrameEnumeration::Impl::Modify(SfxPoolItem *pOld, SfxPoolItem *pNew) +void SwXParaFrameEnumeration::Impl::Modify( const SfxPoolItem *pOld, const SfxPoolItem *pNew) { ClientModify(this, pOld, pNew); if(!GetRegisteredIn()) @@ -1805,9 +1801,7 @@ lcl_CreateNextObject(SwUnoCrsr& i_rUnoCrsr, // the format should be valid here, otherwise the client // would have been removed in ::Modify // check for a shape first - SwClientIter aIter(*pFormat); - SwDrawContact * const pContact = - static_cast<SwDrawContact*>( aIter.First(TYPE(SwDrawContact)) ); + SwDrawContact* const pContact = SwIterator<SwDrawContact,SwFmt>::FirstElement( *pFormat ); if (pContact) { SdrObject * const pSdr = pContact->GetMaster(); diff --git a/sw/source/core/unocore/unoparagraph.cxx b/sw/source/core/unocore/unoparagraph.cxx index 7633c2bdb3ab..f8a620c876fe 100644 --- a/sw/source/core/unocore/unoparagraph.cxx +++ b/sw/source/core/unocore/unoparagraph.cxx @@ -145,7 +145,7 @@ public: return static_cast<const SwTxtNode*>(GetRegisteredIn()); } SwTxtNode * GetTxtNode() { - return static_cast<SwTxtNode*>(pRegisteredIn); + return static_cast<SwTxtNode*>(GetRegisteredInNonConst()); } SwTxtNode & GetTxtNodeOrThrow() { @@ -177,13 +177,13 @@ public: const uno::Sequence< ::rtl::OUString >& rPropertyNames, bool bDirectValuesOnly) throw (uno::RuntimeException); - +protected: // SwClient - virtual void Modify(SfxPoolItem *pOld, SfxPoolItem *pNew); + virtual void Modify(const SfxPoolItem *pOld, const SfxPoolItem *pNew); }; -void SwXParagraph::Impl::Modify(SfxPoolItem *pOld, SfxPoolItem *pNew) +void SwXParagraph::Impl::Modify( const SfxPoolItem *pOld, const SfxPoolItem *pNew ) { ClientModify(this, pOld, pNew); if (!GetRegisteredIn()) diff --git a/sw/source/core/unocore/unoport.cxx b/sw/source/core/unocore/unoport.cxx index 28bd86c51759..132c661bef3e 100644 --- a/sw/source/core/unocore/unoport.cxx +++ b/sw/source/core/unocore/unoport.cxx @@ -62,7 +62,7 @@ using ::rtl::OUString; /****************************************************************** * SwXTextPortion ******************************************************************/ -static void init(SwXTextPortion & rPortion, const SwUnoCrsr* pPortionCursor) +void SwXTextPortion::init(const SwUnoCrsr* pPortionCursor) { SwUnoCrsr* pUnoCursor = pPortionCursor->GetDoc()->CreateUnoCrsr(*pPortionCursor->GetPoint()); @@ -71,7 +71,7 @@ static void init(SwXTextPortion & rPortion, const SwUnoCrsr* pPortionCursor) pUnoCursor->SetMark(); *pUnoCursor->GetMark() = *pPortionCursor->GetMark(); } - pUnoCursor->Add(& rPortion); + pUnoCursor->Add(this); } SwXTextPortion::SwXTextPortion(const SwUnoCrsr* pPortionCrsr, @@ -93,7 +93,7 @@ SwXTextPortion::SwXTextPortion(const SwUnoCrsr* pPortionCrsr, , m_ePortionType(eType) , m_bIsCollapsed(false) { - init(*this, pPortionCrsr); + init( pPortionCrsr); } SwXTextPortion::SwXTextPortion(const SwUnoCrsr* pPortionCrsr, @@ -112,7 +112,7 @@ SwXTextPortion::SwXTextPortion(const SwUnoCrsr* pPortionCrsr, , m_ePortionType(PORTION_FRAME) , m_bIsCollapsed(false) { - init(*this, pPortionCrsr); + init( pPortionCrsr); } SwXTextPortion::SwXTextPortion(const SwUnoCrsr* pPortionCrsr, @@ -132,7 +132,7 @@ SwXTextPortion::SwXTextPortion(const SwUnoCrsr* pPortionCrsr, , m_ePortionType( bIsEnd ? PORTION_RUBY_END : PORTION_RUBY_START ) , m_bIsCollapsed(false) { - init(*this, pPortionCrsr); + init( pPortionCrsr); if (!bIsEnd) { @@ -967,7 +967,7 @@ throw( uno::RuntimeException ) return aRet; } -void SwXTextPortion::Modify( SfxPoolItem *pOld, SfxPoolItem *pNew) +void SwXTextPortion::Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew) { ClientModify(this, pOld, pNew); if (!m_FrameDepend.GetRegisteredIn()) diff --git a/sw/source/core/unocore/unoportenum.cxx b/sw/source/core/unocore/unoportenum.cxx index fe3e74b68050..04bbd54c893b 100644 --- a/sw/source/core/unocore/unoportenum.cxx +++ b/sw/source/core/unocore/unoportenum.cxx @@ -718,7 +718,7 @@ lcl_ExportHints( xRef = pPortion = new SwXTextPortion( pUnoCrsr, xParent, PORTION_FIELD); Reference<XTextField> xField = - CreateSwXTextField(*pDoc, pAttr->GetFld()); + SwXTextField::CreateSwXTextField(*pDoc, pAttr->GetFld()); pPortion->SetTextField(xField); } break; @@ -1167,7 +1167,7 @@ lcl_CreatePortions( "CreatePortions: stack error" ); } -void SwXTextPortionEnumeration::Modify( SfxPoolItem *pOld, SfxPoolItem *pNew) +void SwXTextPortionEnumeration::Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew) { ClientModify(this, pOld, pNew); } diff --git a/sw/source/core/unocore/unoredline.cxx b/sw/source/core/unocore/unoredline.cxx index 18b30f77df44..755afab2e653 100644 --- a/sw/source/core/unocore/unoredline.cxx +++ b/sw/source/core/unocore/unoredline.cxx @@ -561,7 +561,7 @@ void SwXRedline::removeVetoableChangeListener( { } -void SwXRedline::Modify( SfxPoolItem *pOld, SfxPoolItem *pNew) +void SwXRedline::Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew) { ClientModify(this, pOld, pNew); if(!GetRegisteredIn()) diff --git a/sw/source/core/unocore/unoredlines.cxx b/sw/source/core/unocore/unoredlines.cxx index 332cfc406b4b..d0839bf25cf2 100644 --- a/sw/source/core/unocore/unoredlines.cxx +++ b/sw/source/core/unocore/unoredlines.cxx @@ -43,7 +43,7 @@ #include <doc.hxx> #include <docary.hxx> #include <redline.hxx> - +#include <switerator.hxx> using namespace ::com::sun::star; using ::rtl::OUString; @@ -129,13 +129,13 @@ uno::Sequence< OUString > SwXRedlines::getSupportedServiceNames(void) beans::XPropertySet* SwXRedlines::GetObject( SwRedline& rRedline, SwDoc& rDoc ) { SwPageDesc* pStdDesc = rDoc.GetPageDescFromPool(RES_POOLPAGE_STANDARD); - SwClientIter aIter(*pStdDesc); - SwXRedline* pxRedline = (SwXRedline*)aIter.First( TYPE( SwXRedline )); + SwIterator<SwXRedline,SwPageDesc> aIter(*pStdDesc); + SwXRedline* pxRedline = aIter.First(); while(pxRedline) { if(pxRedline->GetRedline() == &rRedline) break; - pxRedline = (SwXRedline*)aIter.Next(); + pxRedline = aIter.Next(); } if( !pxRedline ) pxRedline = new SwXRedline(rRedline, rDoc); @@ -189,7 +189,7 @@ uno::Sequence< OUString > SwXRedlineEnumeration::getSupportedServiceNames(void) return uno::Sequence< OUString >(); } -void SwXRedlineEnumeration::Modify( SfxPoolItem *pOld, SfxPoolItem *pNew) +void SwXRedlineEnumeration::Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew) { ClientModify(this, pOld, pNew); if(!GetRegisteredIn()) diff --git a/sw/source/core/unocore/unorefmk.cxx b/sw/source/core/unocore/unorefmk.cxx index f55c3c6b3037..3e0b77e0f2ce 100644 --- a/sw/source/core/unocore/unorefmk.cxx +++ b/sw/source/core/unocore/unorefmk.cxx @@ -82,9 +82,9 @@ public: bool IsValid() const { return 0 != GetRegisteredIn(); } void InsertRefMark( SwPaM & rPam, SwXTextCursor const*const pCursor ); void Invalidate(); - +protected: // SwClient - virtual void Modify(SfxPoolItem *pOld, SfxPoolItem *pNew); + virtual void Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew); }; @@ -99,7 +99,7 @@ void SwXReferenceMark::Impl::Invalidate() m_pMarkFmt = 0; } -void SwXReferenceMark::Impl::Modify(SfxPoolItem *pOld, SfxPoolItem *pNew) +void SwXReferenceMark::Impl::Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew) { ClientModify(this, pOld, pNew); @@ -113,7 +113,7 @@ void SwXReferenceMark::Impl::Modify(SfxPoolItem *pOld, SfxPoolItem *pNew) { case RES_REFMARK_DELETED: if (static_cast<const void*>(m_pMarkFmt) == - static_cast<SwPtrMsgPoolItem *>(pOld)->pObject) + static_cast<const SwPtrMsgPoolItem *>(pOld)->pObject) { Invalidate(); } @@ -695,9 +695,9 @@ public: inline const ::sw::Meta * GetMeta() const; // only for SwXMetaField! inline const ::sw::MetaField * GetMetaField() const; - +protected: // SwClient - virtual void Modify(SfxPoolItem *pOld, SfxPoolItem *pNew); + virtual void Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew); }; @@ -707,7 +707,7 @@ inline const ::sw::Meta * SwXMeta::Impl::GetMeta() const } // SwModify -void SwXMeta::Impl::Modify( SfxPoolItem *pOld, SfxPoolItem *pNew ) +void SwXMeta::Impl::Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew ) { m_pTextPortions.reset(); // throw away cache (SwTxtNode changed) @@ -807,7 +807,7 @@ bool SwXMeta::SetContentRange( SwTxtMeta const * const pTxtAttr( pMeta->GetTxtAttr() ); if (pTxtAttr) { - rpNode = pTxtAttr->GetTxtNode(); + rpNode = pMeta->GetTxtNode(); if (rpNode) { // rStart points at the first position _within_ the meta! diff --git a/sw/source/core/unocore/unosect.cxx b/sw/source/core/unocore/unosect.cxx index 96d340287f2e..4cb913e093a3 100644 --- a/sw/source/core/unocore/unosect.cxx +++ b/sw/source/core/unocore/unosect.cxx @@ -159,13 +159,13 @@ public: const uno::Sequence< ::rtl::OUString >& rPropertyNames) throw (beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException); - +protected: // SwClient - virtual void Modify(SfxPoolItem *pOld, SfxPoolItem *pNew); + virtual void Modify(const SfxPoolItem *pOld, const SfxPoolItem *pNew); }; -void SwXTextSection::Impl::Modify(SfxPoolItem *pOld, SfxPoolItem *pNew) +void SwXTextSection::Impl::Modify( const SfxPoolItem *pOld, const SfxPoolItem *pNew) { ClientModify(this, pOld, pNew); if (!GetRegisteredIn()) diff --git a/sw/source/core/unocore/unosett.cxx b/sw/source/core/unocore/unosett.cxx index eb88942ec893..7ddddeb88c6e 100644 --- a/sw/source/core/unocore/unosett.cxx +++ b/sw/source/core/unocore/unosett.cxx @@ -520,7 +520,7 @@ uno::Any SwXFootnoteProperties::getPropertyValue(const OUString& rPropertyName) case WID_PAGE_STYLE : { String aString; - if( rFtnInfo.GetPageDescDep()->GetRegisteredIn() ) + if( rFtnInfo.KnowsPageDesc() ) { SwStyleNameMapper::FillProgName( rFtnInfo.GetPageDesc( *pDoc )->GetName(), @@ -767,7 +767,7 @@ uno::Any SwXEndnoteProperties::getPropertyValue(const OUString& rPropertyName) case WID_PAGE_STYLE : { String aString; - if( rEndInfo.GetPageDescDep()->GetRegisteredIn() ) + if( rEndInfo.KnowsPageDesc() ) { SwStyleNameMapper::FillProgName( rEndInfo.GetPageDesc( *pDoc )->GetName(), @@ -1021,7 +1021,7 @@ Any SwXLineNumberingProperties::getPropertyValue(const OUString& rPropertyName) String aString; // return empty string if no char format is set // otherwise it would be created here - if(rInfo.GetRegisteredIn()) + if(rInfo.HasCharFormat()) { SwStyleNameMapper::FillProgName( rInfo.GetCharFmt(*pDoc)->GetName(), @@ -2288,7 +2288,7 @@ void SwXNumberingRules::setName(const OUString& /*rName*/) throw( RuntimeExcepti throw aExcept; } -void SwXNumberingRules::Modify( SfxPoolItem *pOld, SfxPoolItem *pNew) +void SwXNumberingRules::Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew) { ClientModify(this, pOld, pNew); if(!GetRegisteredIn()) diff --git a/sw/source/core/unocore/unostyle.cxx b/sw/source/core/unocore/unostyle.cxx index 3fc84350cd5c..dcd88b5da130 100644 --- a/sw/source/core/unocore/unostyle.cxx +++ b/sw/source/core/unocore/unostyle.cxx @@ -1358,7 +1358,7 @@ SwXStyle::~SwXStyle() delete pPropImpl; } -void SwXStyle::Modify( SfxPoolItem *pOld, SfxPoolItem *pNew) +void SwXStyle::Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew) { ClientModify(this, pOld, pNew); if(!GetRegisteredIn()) @@ -1853,7 +1853,7 @@ void lcl_SetStyleProperty(const SfxItemPropertySimpleEntry& rEntry, SwPageDesc* pPageDesc = ::GetPageDescByName_Impl(*pDoc, sDescName); if(pPageDesc) { - pPageDesc->Add( pNewDesc ); + pNewDesc->RegisterToPageDesc( *pPageDesc ); bPut = sal_True; } else @@ -3608,7 +3608,7 @@ SwXAutoStyleFamily::~SwXAutoStyleFamily() { } -void SwXAutoStyleFamily::Modify( SfxPoolItem *pOld, SfxPoolItem *pNew) +void SwXAutoStyleFamily::Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew) { ClientModify(this, pOld, pNew); if(!GetRegisteredIn()) @@ -3736,7 +3736,7 @@ SwXAutoStylesEnumerator::~SwXAutoStylesEnumerator() delete pImpl; } -void SwXAutoStylesEnumerator::Modify( SfxPoolItem *pOld, SfxPoolItem *pNew) +void SwXAutoStylesEnumerator::Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew) { ClientModify(this, pOld, pNew); if(!GetRegisteredIn()) @@ -3781,7 +3781,7 @@ SwXAutoStyle::~SwXAutoStyle() { } -void SwXAutoStyle::Modify( SfxPoolItem *pOld, SfxPoolItem *pNew) +void SwXAutoStyle::Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew) { ClientModify(this, pOld, pNew); if(!GetRegisteredIn()) diff --git a/sw/source/core/unocore/unotbl.cxx b/sw/source/core/unocore/unotbl.cxx index e3858cd282b2..cde12d3d5d63 100644 --- a/sw/source/core/unocore/unotbl.cxx +++ b/sw/source/core/unocore/unotbl.cxx @@ -104,6 +104,7 @@ #include <sortopt.hxx> #include <rtl/math.hxx> #include <editeng/frmdiritem.hxx> +#include <switerator.hxx> using namespace ::com::sun::star; using ::rtl::OUString; @@ -590,16 +591,16 @@ void lcl_InspectLines(SwTableLines& rLines, SvStrings& rAllNames) void lcl_FormatTable(SwFrmFmt* pTblFmt) { - SwClientIter aIter( *pTblFmt ); - for( SwClient* pC = aIter.First( TYPE( SwFrm )); - pC; pC = aIter.Next() ) + SwIterator<SwFrm,SwFmt> aIter( *pTblFmt ); + for( SwFrm* pFrm = aIter.First(); pFrm; pFrm = aIter.Next() ) { - if( ((SwFrm*)pC)->IsTabFrm() ) + // mba: no TYPEINFO for SwTabFrm + if( pFrm->IsTabFrm() ) { - if(((SwFrm*)pC)->IsValid()) - ((SwFrm*)pC)->InvalidatePos(); - ((SwTabFrm*)pC)->SetONECalcLowers(); - ((SwTabFrm*)pC)->Calc(); + if(pFrm->IsValid()) + pFrm->InvalidatePos(); + ((SwTabFrm*)pFrm)->SetONECalcLowers(); + ((SwTabFrm*)pFrm)->Calc(); } } } @@ -695,9 +696,7 @@ inline rtl::OUString lcl_getString( SwXCell &rCell ) return rCell.getString(); } -/* -------------------------------------------------- - * non UNO function call to set string in SwXCell - * --------------------------------------------------*/ +/* non UNO function call to set string in SwXCell */ void lcl_setString( SwXCell &rCell, const rtl::OUString &rTxt, sal_Bool bKeepNumberFmt ) { @@ -714,9 +713,7 @@ void lcl_setString( SwXCell &rCell, const rtl::OUString &rTxt, rCell.SwXText::setString(rTxt); } -/* -------------------------------------------------- - * non UNO function call to get value from SwXCell - * --------------------------------------------------*/ +/* non UNO function call to get value from SwXCell */ double lcl_getValue( SwXCell &rCell ) { double fRet; @@ -727,9 +724,7 @@ double lcl_getValue( SwXCell &rCell ) return fRet; } -/* -------------------------------------------------- - * non UNO function call to set value in SwXCell - * --------------------------------------------------*/ +/* non UNO function call to set value in SwXCell */ void lcl_setValue( SwXCell &rCell, double nVal ) { if(rCell.IsValid()) @@ -1226,7 +1221,7 @@ sal_Bool SwXCell::hasElements(void) throw( uno::RuntimeException ) return sal_True; } -void SwXCell::Modify( SfxPoolItem *pOld, SfxPoolItem *pNew) +void SwXCell::Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew) { ClientModify(this, pOld, pNew); } @@ -1245,15 +1240,14 @@ SwXCell* SwXCell::CreateXCell(SwFrmFmt* pTblFmt, SwTableBox* pBox, SwTable *pTab //wenn es die Box gibt, dann wird auch eine Zelle zurueckgegeben if(pFoundBox) { - SwClientIter aIter( *pTblFmt ); - SwXCell* pXCell = (SwXCell*)aIter. - First( TYPE( SwXCell )); + SwIterator<SwXCell,SwFmt> aIter( *pTblFmt ); + SwXCell* pXCell = aIter.First(); while( pXCell ) { // gibt es eine passende Zelle bereits? if(pXCell->GetTblBox() == pBox) break; - pXCell = (SwXCell*)aIter.Next(); + pXCell = aIter.Next(); } //sonst anlegen if(!pXCell) @@ -1264,9 +1258,7 @@ SwXCell* SwXCell::CreateXCell(SwFrmFmt* pTblFmt, SwTableBox* pBox, SwTable *pTab return pRet; } -/* -------------------------------------------------- - * exitstiert die Box in der angegebenen Tabelle? - * --------------------------------------------------*/ +/* does box exist in given table? */ SwTableBox* SwXCell::FindBox(SwTable* pTable, SwTableBox* pBox2) { // check if nFndPos happens to point to the right table box @@ -1471,7 +1463,7 @@ void SwXTextTableRow::removeVetoableChangeListener(const OUString& /*rPropertyNa DBG_WARNING("not implemented"); } -void SwXTextTableRow::Modify( SfxPoolItem *pOld, SfxPoolItem *pNew) +void SwXTextTableRow::Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew) { ClientModify(this, pOld, pNew); } @@ -1903,7 +1895,7 @@ void SwXTextTableCursor::removeVetoableChangeListener(const OUString& /*rPropert DBG_WARNING("not implemented"); } -void SwXTextTableCursor::Modify( SfxPoolItem *pOld, SfxPoolItem *pNew) +void SwXTextTableCursor::Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew) { ClientModify(this, pOld, pNew); } @@ -1927,6 +1919,7 @@ public: void ApplyTblAttr(const SwTable& rTbl, SwDoc& rDoc); }; + SwTableProperties_Impl::SwTableProperties_Impl() { } @@ -2151,7 +2144,6 @@ SwXTextTable::SwXTextTable() : bFirstRowAsLabel(sal_False), bFirstColumnAsLabel(sal_False) { - } SwXTextTable::SwXTextTable(SwFrmFmt& rFrmFmt) : @@ -2166,7 +2158,6 @@ SwXTextTable::SwXTextTable(SwFrmFmt& rFrmFmt) : bFirstRowAsLabel(sal_False), bFirstColumnAsLabel(sal_False) { - } SwXTextTable::~SwXTextTable() @@ -2191,8 +2182,7 @@ uno::Reference< table::XTableRows > SwXTextTable::getRows(void) throw( uno::Run uno::Reference< table::XTableRows > xRet; if (SwFrmFmt* pFmt = GetFrmFmt()) { - SwXTableRows* pRows = (SwXTableRows*)SwClientIter(*pFmt). - First(TYPE(SwXTableRows)); + SwXTableRows* pRows = SwIterator<SwXTableRows,SwFmt>::FirstElement(*pFmt); if (!pRows) pRows = new SwXTableRows(*pFmt); xRet = pRows; @@ -2208,8 +2198,7 @@ uno::Reference< table::XTableColumns > SwXTextTable::getColumns(void) throw( un uno::Reference< table::XTableColumns > xRet; if (SwFrmFmt* pFmt = GetFrmFmt()) { - SwXTableColumns* pCols = (SwXTableColumns*)SwClientIter(*pFmt). - First(TYPE(SwXTableColumns)); + SwXTableColumns* pCols = SwIterator<SwXTableColumns,SwFmt>::FirstElement(*pFmt); if (!pCols) pCols = new SwXTableColumns(*pFmt); xRet = pCols; @@ -2334,18 +2323,7 @@ void SwXTextTable::attachToRange(const uno::Reference< text::XTextRange > & xTex // hier muessen die Properties des Descriptors ausgewertet werden pTableProps->ApplyTblAttr(*pTable, *pDoc); SwFrmFmt* pTblFmt = pTable->GetFrmFmt(); - SwClientIter aIter( *pTblFmt ); - for( SwClient* pC = aIter.First( TYPE( SwFrm )); - pC; pC = aIter.Next() ) - { - if( ((SwFrm*)pC)->IsTabFrm() ) - { - if(((SwFrm*)pC)->IsValid()) - ((SwFrm*)pC)->InvalidatePos(); - ((SwTabFrm*)pC)->SetONECalcLowers(); - ((SwTabFrm*)pC)->Calc(); - } - } + lcl_FormatTable( pTblFmt ); pTblFmt->Add(this); if(m_sTableName.Len()) @@ -3081,9 +3059,9 @@ void SwXTextTable::setPropertyValue(const OUString& rPropertyName, && pBorder) { SwDoc* pDoc = pFmt->GetDoc(); - SwClientIter aIter( *pFmt ); + SwFrm* pFrm = SwIterator<SwFrm,SwFmt>::FirstElement( *pFmt ); //Tabellen ohne Layout (unsichtbare Header/Footer ) - if(0 != aIter.First( TYPE( SwFrm ))) + if( pFrm ) { lcl_FormatTable(pFmt); SwTable* pTable = SwTable::FindTable( pFmt ); @@ -3276,9 +3254,9 @@ uno::Any SwXTextTable::getPropertyValue(const OUString& rPropertyName) throw( be case FN_UNO_TABLE_BORDER: { SwDoc* pDoc = pFmt->GetDoc(); - SwClientIter aIter( *pFmt ); + SwFrm* pFrm = SwIterator<SwFrm,SwFmt>::FirstElement( *pFmt ); //Tabellen ohne Layout (unsichtbare Header/Footer ) - if(0 != aIter.First( TYPE( SwFrm ))) + if( pFrm ) { lcl_FormatTable(pFmt); SwTable* pTable = SwTable::FindTable( pFmt ); @@ -3571,7 +3549,7 @@ sal_uInt16 SwXTextTable::getColumnCount(void) return nRet; } -void SwXTextTable::Modify( SfxPoolItem *pOld, SfxPoolItem *pNew) +void SwXTextTable::Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew) { if(pOld && pOld->Which() == RES_REMOVE_UNO_OBJECT && (void*)GetRegisteredIn() == ((SwPtrMsgPoolItem *)pOld)->pObject ) @@ -4591,7 +4569,7 @@ const SwUnoCrsr* SwXCellRange::GetTblCrsr() const return pRet; } -void SwXCellRange::Modify( SfxPoolItem *pOld, SfxPoolItem *pNew) +void SwXCellRange::Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew) { ClientModify(this, pOld, pNew ); if(!GetRegisteredIn() || !aCursorDepend.GetRegisteredIn()) @@ -4669,15 +4647,14 @@ uno::Any SwXTableRows::getByIndex(sal_Int32 nIndex) if(pTable->GetTabLines().Count() > nIndex) { SwTableLine* pLine = pTable->GetTabLines().GetObject((sal_uInt16)nIndex); - SwClientIter aIter( *pFrmFmt ); - SwXTextTableRow* pXRow = (SwXTextTableRow*)aIter. - First( TYPE( SwXTextTableRow )); + SwIterator<SwXTextTableRow,SwFmt> aIter( *pFrmFmt ); + SwXTextTableRow* pXRow = aIter.First(); while( pXRow ) { // gibt es eine passende Zelle bereits? if(pXRow->GetTblRow() == pLine) break; - pXRow = (SwXTextTableRow*)aIter.Next(); + pXRow = aIter.Next(); } //sonst anlegen if(!pXRow) @@ -4821,7 +4798,7 @@ void SwXTableRows::removeByIndex(sal_Int32 nIndex, sal_Int32 nCount) throw( uno: } } -void SwXTableRows::Modify( SfxPoolItem *pOld, SfxPoolItem *pNew) +void SwXTableRows::Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew) { ClientModify(this, pOld, pNew); } @@ -5030,7 +5007,7 @@ void SwXTableColumns::removeByIndex(sal_Int32 nIndex, sal_Int32 nCount) throw( u } } -void SwXTableColumns::Modify( SfxPoolItem *pOld, SfxPoolItem *pNew) +void SwXTableColumns::Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew) { ClientModify(this, pOld, pNew); } diff --git a/sw/source/core/unocore/unotext.cxx b/sw/source/core/unocore/unotext.cxx index 86c2226a9a57..17e3723d9df0 100644 --- a/sw/source/core/unocore/unotext.cxx +++ b/sw/source/core/unocore/unotext.cxx @@ -1780,29 +1780,6 @@ static bool lcl_SimilarPosition( const sal_Int32 nPos1, const sal_Int32 nPos2 ) return abs( nPos1 - nPos2 ) < COL_POS_FUZZY; } -void SwXText::copyText( - const uno::Reference< text::XTextCopy >& xSource ) - throw ( uno::RuntimeException ) -{ - SolarMutexGuard aGuard; - - uno::Reference< text::XText > xText( xSource, uno::UNO_QUERY_THROW ); - uno::Reference< text::XTextCursor > xCursor = xText->createTextCursor( ); - xCursor->gotoEnd( sal_True ); - - uno::Reference< lang::XUnoTunnel > xTunnel( xCursor, uno::UNO_QUERY_THROW ); - - OTextCursorHelper* pCursor = 0; - pCursor = reinterpret_cast< OTextCursorHelper* >( - sal::static_int_cast< sal_IntPtr >( xTunnel->getSomething( OTextCursorHelper::getUnoTunnelId()) )); - if ( pCursor ) - { - SwNodeIndex rNdIndex( *GetStartNode( ), 1 ); - SwPosition rPos( rNdIndex ); - m_pImpl->m_pDoc->CopyRange( *pCursor->GetPaM( ), rPos, false ); - } -} - void SwXText::Impl::ConvertCell( const bool bFirstCell, const uno::Sequence< uno::Reference< text::XTextRange > > & rCell, @@ -2306,6 +2283,35 @@ throw (lang::IllegalArgumentException, uno::RuntimeException) return xRet; } + +void SAL_CALL +SwXText::copyText( + const uno::Reference< text::XTextCopy >& xSource ) +throw (uno::RuntimeException) +{ + SolarMutexGuard aGuard; + + uno::Reference< text::XText > const xText(xSource, uno::UNO_QUERY_THROW); + uno::Reference< text::XTextCursor > const xCursor = + xText->createTextCursor(); + xCursor->gotoEnd( sal_True ); + + uno::Reference< lang::XUnoTunnel > const xCursorTunnel(xCursor, + uno::UNO_QUERY_THROW); + + OTextCursorHelper *const pCursor = + ::sw::UnoTunnelGetImplementation<OTextCursorHelper>(xCursorTunnel); + if (!pCursor) + { + throw uno::RuntimeException(); + } + + SwNodeIndex rNdIndex( *GetStartNode( ), 1 ); + SwPosition rPos( rNdIndex ); + m_pImpl->m_pDoc->CopyRange( *pCursor->GetPaM(), rPos, false ); +} + + /****************************************************************** * SwXBodyText ******************************************************************/ @@ -2567,13 +2573,13 @@ public: } return *pFmt; } - +protected: // SwClient - virtual void Modify(SfxPoolItem *pOld, SfxPoolItem *pNew); + virtual void Modify(const SfxPoolItem *pOld, const SfxPoolItem *pNew); }; -void SwXHeadFootText::Impl::Modify(SfxPoolItem *pOld, SfxPoolItem *pNew) +void SwXHeadFootText::Impl::Modify( const SfxPoolItem *pOld, const SfxPoolItem *pNew) { ClientModify(this, pOld, pNew); } diff --git a/sw/source/core/unocore/unotextmarkup.cxx b/sw/source/core/unocore/unotextmarkup.cxx index bbc66172162f..5f932220bb54 100644 --- a/sw/source/core/unocore/unotextmarkup.cxx +++ b/sw/source/core/unocore/unotextmarkup.cxx @@ -49,7 +49,9 @@ using namespace ::com::sun::star; SwXTextMarkup::SwXTextMarkup( SwTxtNode& rTxtNode, const ModelToViewHelper::ConversionMap* pMap ) : mpTxtNode( &rTxtNode ), mpConversionMap( pMap ) { - mpTxtNode->Add(this); + // FME 2007-07-16 #i79641# SwXTextMarkup is allowed to be removed ... + SetIsAllowedToBeRemovedInModifyCall(true); + mpTxtNode->Add(this); } SwXTextMarkup::~SwXTextMarkup() @@ -422,12 +424,12 @@ throw (lang::IllegalArgumentException, uno::RuntimeException) } -void SwXTextMarkup::Modify( SfxPoolItem* /*pOld*/, SfxPoolItem* /*pNew*/ ) +void SwXTextMarkup::Modify( const SfxPoolItem* /*pOld*/, const SfxPoolItem* /*pNew*/ ) { // FME 2007-07-16 #i79641# In my opinion this is perfectly legal, // therefore I remove the assertion in SwModify::_Remove() - if ( pRegisteredIn ) - pRegisteredIn->Remove( this ); + if ( GetRegisteredIn() ) + GetRegisteredInNonConst()->Remove( this ); // <-- SolarMutexGuard aGuard; diff --git a/sw/source/core/view/printdata.cxx b/sw/source/core/view/printdata.cxx index 19193935cb76..aabb24a294b3 100644 --- a/sw/source/core/view/printdata.cxx +++ b/sw/source/core/view/printdata.cxx @@ -108,13 +108,13 @@ void SwRenderData::DeletePostItData() } } -bool SwRenderData::NeedNewViewOptionAdjust( const SwWrtShell& rCompare ) const +bool SwRenderData::NeedNewViewOptionAdjust( const ViewShell& rCompare ) const { return m_pViewOptionAdjust ? ! m_pViewOptionAdjust->checkShell( rCompare ) : true; } -void SwRenderData::ViewOptionAdjustStart( SwWrtShell &rSh, const SwViewOption &rViewOptions ) +void SwRenderData::ViewOptionAdjustStart( ViewShell &rSh, const SwViewOption &rViewOptions ) { if (m_pViewOptionAdjust) { diff --git a/sw/source/core/view/vdraw.cxx b/sw/source/core/view/vdraw.cxx index d787806203de..17710c82ee78 100644 --- a/sw/source/core/view/vdraw.cxx +++ b/sw/source/core/view/vdraw.cxx @@ -181,7 +181,7 @@ sal_Bool SwViewImp::IsDragPossible( const Point &rPoint ) SdrObject *pO = rMrkList.GetMark(rMrkList.GetMarkCount()-1)->GetMarkedSdrObj(); SwRect aRect; - if( ::CalcClipRect( pO, aRect, sal_False ) ) + if( pO && ::CalcClipRect( pO, aRect, sal_False ) ) { SwRect aTmp; ::CalcClipRect( pO, aTmp, sal_True ); diff --git a/sw/source/core/view/viewimp.cxx b/sw/source/core/view/viewimp.cxx index aa60644f8adb..96cef3170ece 100644 --- a/sw/source/core/view/viewimp.cxx +++ b/sw/source/core/view/viewimp.cxx @@ -59,7 +59,7 @@ void SwViewImp::Init( const SwViewOption *pNewOpt ) { OSL_ENSURE( pDrawView, "SwViewImp::Init without DrawView" ); //Now create the page view if it does not exist. - SwRootFrm *pRoot = pSh->getIDocumentLayoutAccess()->GetRootFrm(); + SwRootFrm *pRoot = pSh->GetLayout(); //swmod 071108//swmod 071225 if ( !pSdrPageView ) { IDocumentDrawModelAccess* pIDDMA = pSh->getIDocumentDrawModelAccess(); @@ -260,7 +260,7 @@ Color SwViewImp::GetRetoucheColor() const const ViewShell &rSh = *GetShell(); if ( rSh.GetWin() ) { - if ( rSh.getIDocumentSettingAccess()->get(IDocumentSettingAccess::BROWSE_MODE) && + if ( rSh.GetViewOptions()->getBrowseMode() && COL_TRANSPARENT != rSh.GetViewOptions()->GetRetoucheColor().GetColor() ) aRet = rSh.GetViewOptions()->GetRetoucheColor(); else if(rSh.GetViewOptions()->IsPagePreview() && @@ -284,10 +284,10 @@ void SwViewImp::UpdateAccessible() // We require a layout and an XModel to be accessible. IDocumentLayoutAccess* pIDLA = GetShell()->getIDocumentLayoutAccess(); Window *pWin = GetShell()->GetWin(); - OSL_ENSURE( pIDLA->GetRootFrm(), "no layout, no access" ); + OSL_ENSURE( GetShell()->GetLayout(), "no layout, no access" ); //swmod 071108//swmod 071225 OSL_ENSURE( pWin, "no window, no access" ); - if( IsAccessible() && pIDLA->GetRootFrm() && pWin ) + if( IsAccessible() && pIDLA->GetCurrentViewShell() && pWin ) //swmod 071108//swmod 071225 GetAccessibleMap().GetDocumentView(); } diff --git a/sw/source/core/view/viewpg.cxx b/sw/source/core/view/viewpg.cxx index b2d866f96c4c..765a6cd94fab 100644 --- a/sw/source/core/view/viewpg.cxx +++ b/sw/source/core/view/viewpg.cxx @@ -83,7 +83,6 @@ void ViewShell::AdjustOptionsForPagePreview(SwPrintData const& rPrintOptions) return; } - //#i14016# - consider empty pages on calculation of the scaling for a page to be printed. void ViewShell::PrintProspect( OutputDevice *pOutDev, diff --git a/sw/source/core/view/viewsh.cxx b/sw/source/core/view/viewsh.cxx index afeaa33de325..fba37f34809d 100644 --- a/sw/source/core/view/viewsh.cxx +++ b/sw/source/core/view/viewsh.cxx @@ -241,7 +241,7 @@ void ViewShell::ImplEndAction( const sal_Bool bIdleEnd ) if ( pRegion ) { - SwRootFrm* pLayout = GetLayout(); + SwRootFrm* pCurrentLayout = GetLayout(); Imp()->pRegion = NULL; @@ -303,7 +303,7 @@ void ViewShell::ImplEndAction( const sal_Bool bIdleEnd ) pOut = pVout; if ( bPaintsFromSystem ) PaintDesktop( aRect ); - pLayout->Paint( aRect ); + pCurrentLayout->Paint( aRect ); pOld->DrawOutDev( aRect.Pos(), aRect.SSize(), aRect.Pos(), aRect.SSize(), *pVout ); pOut = pOld; @@ -324,7 +324,7 @@ void ViewShell::ImplEndAction( const sal_Bool bIdleEnd ) if ( bPaintsFromSystem ) PaintDesktop( aRect ); - pLayout->Paint( aRect ); + pCurrentLayout->Paint( aRect ); // #i75172# end DrawingLayer paint DLPostPaint2(true); @@ -465,12 +465,14 @@ sal_Bool ViewShell::AddPaintRect( const SwRect & rRect ) ViewShell *pSh = this; do { + if( pSh->Imp() ) + { if ( pSh->IsPreView() && pSh->GetWin() ) ::RepaintPagePreview( pSh, rRect ); else - bRet |= pSh->Imp()->AddPaintRect( rRect ); + bRet |= pSh->Imp()->AddPaintRect( rRect );//swmod 080111 + } pSh = (ViewShell*)pSh->GetNext(); - } while ( pSh != this ); return bRet; } @@ -503,7 +505,7 @@ void ViewShell::MakeVisible( const SwRect &rRect ) { if( pWin ) { - const SwFrm* pRoot = GetDoc()->GetRootFrm(); + const SwFrm* pRoot = GetLayout(); int nLoopCnt = 3; long nOldH; do{ @@ -511,7 +513,7 @@ void ViewShell::MakeVisible( const SwRect &rRect ) StartAction(); ScrollMDI( this, rRect, USHRT_MAX, USHRT_MAX ); EndAction(); - } while( nOldH != pRoot->Frm().Height() && nLoopCnt-- ); + } while( nOldH != pRoot->Frm().Height() && nLoopCnt-- ); //swmod 071108//swmod 071225 } #if OSL_DEBUG_LEVEL > 1 else @@ -977,10 +979,10 @@ void ViewShell::VisPortChgd( const SwRect &rRect) const long nXDiff = aPrevArea.Left() - VisArea().Left(); const long nYDiff = aPrevArea.Top() - VisArea().Top(); - if( !nXDiff && !getIDocumentSettingAccess()->get(IDocumentSettingAccess::BROWSE_MODE) && + if( !nXDiff && !GetViewOptions()->getBrowseMode() && (!Imp()->HasDrawView() || !Imp()->GetDrawView()->IsGridVisible() ) ) { - const SwPageFrm *pPage = (SwPageFrm*)GetDoc()->GetRootFrm()->Lower(); + const SwPageFrm *pPage = (SwPageFrm*)GetLayout()->Lower(); //swmod 071108//swmod 071225 if ( pPage->Frm().Top() > pOldPage->Frm().Top() ) pPage = (SwPageFrm*)pOldPage; SwRect aBoth( VisArea() ); @@ -1350,7 +1352,7 @@ void ViewShell::PaintDesktop( const SwRect &rRect ) if ( !GetWin() && !GetOut()->GetConnectMetaFile() ) return; sal_Bool bBorderOnly = sal_False; - const SwRootFrm *pRoot = GetDoc()->GetRootFrm(); + const SwRootFrm *pRoot = GetLayout();//swmod 080305 if ( rRect.Top() > pRoot->Frm().Bottom() ) { const SwFrm *pPg = pRoot->Lower(); @@ -1372,7 +1374,7 @@ void ViewShell::PaintDesktop( const SwRect &rRect ) if ( bBorderOnly ) { - const SwFrm *pPage = pRoot->Lower(); + const SwFrm *pPage =pRoot->Lower(); //swmod 071108//swmod 071225 SwRect aLeft( rRect ), aRight( rRect ); while ( pPage ) { @@ -1729,8 +1731,7 @@ sal_Int32 ViewShell::GetBrowseWidth() const void ViewShell::CheckBrowseView( sal_Bool bBrowseChgd ) { - if ( !bBrowseChgd && - !getIDocumentSettingAccess()->get(IDocumentSettingAccess::BROWSE_MODE) ) + if ( !bBrowseChgd && !GetViewOptions()->getBrowseMode() ) return; SET_CURR_SHELL( this ); @@ -1788,14 +1789,15 @@ void ViewShell::CheckBrowseView( sal_Bool bBrowseChgd ) SwRootFrm *ViewShell::GetLayout() const { - return GetDoc()->GetRootFrm(); + return pLayout.get(); //swmod 080116 } +/***********************************************************************/ OutputDevice& ViewShell::GetRefDev() const { OutputDevice* pTmpOut = 0; if ( GetWin() && - getIDocumentSettingAccess()->get(IDocumentSettingAccess::BROWSE_MODE) && + GetViewOptions()->getBrowseMode() && !GetViewOptions()->IsPrtFormat() ) pTmpOut = GetWin(); else if ( 0 != mpTmpRef ) @@ -1844,7 +1846,9 @@ void ViewShell::ApplyViewOptions( const SwViewOption &rOpt ) ImplApplyViewOptions( rOpt ); - //Some changes have to be synchronized + // With one layout per view it is not longer necessary + // to sync these "layout related" view options + // But as long as we have to disable "multiple layout" pSh = (ViewShell*)this->GetNext(); while ( pSh != this ) { @@ -1860,6 +1864,7 @@ void ViewShell::ApplyViewOptions( const SwViewOption &rOpt ) pSh->ImplApplyViewOptions( aOpt ); pSh = (ViewShell*)pSh->GetNext(); } + // End of disabled multiple window pSh = this; do @@ -1898,7 +1903,7 @@ void ViewShell::ImplApplyViewOptions( const SwViewOption &rOpt ) if( pFldType && pFldType->GetDepends() ) { SwMsgPoolItem aHnt( RES_HIDDENPARA_PRINT ); - pFldType->Modify( &aHnt, 0); + pFldType->ModifyNotification( &aHnt, 0); } bReformat = sal_True; } @@ -1924,12 +1929,17 @@ void ViewShell::ImplApplyViewOptions( const SwViewOption &rOpt ) // Wenn kein ReferenzDevice (Drucker) zum Formatieren benutzt wird, // sondern der Bildschirm, muss bei Zoomfaktoraenderung neu formatiert // werden. - if( getIDocumentSettingAccess()->get(IDocumentSettingAccess::BROWSE_MODE) ) + if( pOpt->getBrowseMode() ) bReformat = sal_True; } - if ( getIDocumentSettingAccess()->get(IDocumentSettingAccess::BROWSE_MODE) && - pOpt->IsPrtFormat() != rOpt.IsPrtFormat() ) + bool bBrowseModeChanged = false; + if( pOpt->getBrowseMode() != rOpt.getBrowseMode() ) + { + bBrowseModeChanged = true; + bReformat = sal_True; + } + else if( pOpt->getBrowseMode() && pOpt->IsPrtFormat() != rOpt.IsPrtFormat() ) bReformat = sal_True; if ( HasDrawView() || rOpt.IsGridVisible() ) @@ -1973,6 +1983,15 @@ void ViewShell::ImplApplyViewOptions( const SwViewOption &rOpt ) pDoc->set(IDocumentSettingAccess::HTML_MODE, 0 != ::GetHtmlMode(pDoc->GetDocShell())); + if( bBrowseModeChanged ) + { + // --> FME 2005-03-16 #i44963# Good occasion to check if page sizes in + // page descriptions are still set to (LONG_MAX, LONG_MAX) (html import) + pDoc->CheckDefaultPageFmt(); + // <-- + CheckBrowseView( sal_True ); + } + pMyWin->Invalidate(); if ( bReformat ) { @@ -2038,8 +2057,7 @@ void ViewShell::SetPDFExportOption(sal_Bool bSet) { if( bSet != pOpt->IsPDFExport() ) { - if( bSet && - getIDocumentSettingAccess()->get(IDocumentSettingAccess::BROWSE_MODE) ) + if( bSet && pOpt->getBrowseMode() ) pOpt->SetPrtFormat( sal_True ); pOpt->SetPDFExport(bSet); } @@ -2090,13 +2108,11 @@ uno::Reference< ::com::sun::star::accessibility::XAccessible > ViewShell::Create { uno::Reference< ::com::sun::star::accessibility::XAccessible > xAcc; - SwDoc *pMyDoc = GetDoc(); - // We require a layout and an XModel to be accessible. - OSL_ENSURE( pMyDoc->GetRootFrm(), "no layout, no access" ); + OSL_ENSURE( pLayout, "no layout, no access" ); OSL_ENSURE( GetWin(), "no window, no access" ); - if( pMyDoc->GetRootFrm() && GetWin() ) + if( pDoc->GetCurrentViewShell() && GetWin() ) //swmod 071108 xAcc = Imp()->GetAccessibleMap().GetDocumentView(); return xAcc; @@ -2109,16 +2125,16 @@ ViewShell::CreateAccessiblePreview() "Can't create accessible preview for non-preview ViewShell" ); // We require a layout and an XModel to be accessible. - OSL_ENSURE( pDoc->GetRootFrm(), "no layout, no access" ); + OSL_ENSURE( pLayout, "no layout, no access" ); OSL_ENSURE( GetWin(), "no window, no access" ); - if ( IsPreView() && pDoc->GetRootFrm() && GetWin() ) + if ( IsPreView() && GetLayout()&& GetWin() ) { return Imp()->GetAccessibleMap().GetDocumentPreview( PagePreviewLayout()->maPrevwPages, GetWin()->GetMapMode().GetScaleX(), - pDoc->GetRootFrm()->GetPageByPageNum( PagePreviewLayout()->mnSelectedPageNum ), - PagePreviewLayout()->maWinSize ); + GetLayout()->GetPageByPageNum( PagePreviewLayout()->mnSelectedPageNum ), + PagePreviewLayout()->maWinSize ); //swmod 080305 } return NULL; } @@ -2196,6 +2212,30 @@ void ViewShell::SetCareWin( Window* pNew ) pCareWindow = pNew; } +sal_uInt16 ViewShell::GetPageCount() const +{ + return GetLayout() ? GetLayout()->GetPageNum() : 1; +} + +const Size ViewShell::GetPageSize( sal_uInt16 nPageNum, bool bSkipEmptyPages ) const +{ + Size aSize; + const SwRootFrm* pTmpRoot = GetLayout(); + if( pTmpRoot && nPageNum ) + { + const SwPageFrm* pPage = static_cast<const SwPageFrm*> + (pTmpRoot->Lower()); + + while( --nPageNum && pPage->GetNext() ) + pPage = static_cast<const SwPageFrm*>( pPage->GetNext() ); + + if( !bSkipEmptyPages && pPage->IsEmptyPage() && pPage->GetNext() ) + pPage = static_cast<const SwPageFrm*>( pPage->GetNext() ); + + aSize = pPage->Frm().SSize(); + } + return aSize; +} // #i12836# enhanced pdf export sal_Int32 ViewShell::GetPageNumAndSetOffsetForPDF( OutputDevice& rOut, const SwRect& rRect ) const diff --git a/sw/source/core/view/vnew.cxx b/sw/source/core/view/vnew.cxx index 56ab8dd12671..668a9028d36a 100644 --- a/sw/source/core/view/vnew.cxx +++ b/sw/source/core/view/vnew.cxx @@ -48,7 +48,7 @@ #include <ndgrf.hxx> #include <ndindex.hxx> #include <accessibilityoptions.hxx> - +#include <switerator.hxx> void ViewShell::Init( const SwViewOption *pNewOpt ) { RTL_LOGFILE_CONTEXT_AUTHOR( aLog, "SW", "JP93722", "ViewShell::Init" ); @@ -89,8 +89,7 @@ void ViewShell::Init( const SwViewOption *pNewOpt ) if ( pOut && pOut->GetPDFWriter() ) pPDFOut = pOut; // #i41075# Only setup the printer if we need one: - const IDocumentSettingAccess* pIDSA = getIDocumentSettingAccess(); - const bool bBrowseMode = pIDSA->get(IDocumentSettingAccess::BROWSE_MODE); + const bool bBrowseMode = pOpt->getBrowseMode(); if( pPDFOut ) InitPrt( pPDFOut ); // #i44963# Good occasion to check if page sizes in page descriptions @@ -110,12 +109,24 @@ void ViewShell::Init( const SwViewOption *pNewOpt ) GetWin()->SetLineColor(); } - //Layout erzeugen wenn es noch nicht vorhanden ist. - SwRootFrm* pRoot = GetDoc()->GetRootFrm(); - if( !pRoot ) - GetDoc()->SetRootFrm( pRoot = new SwRootFrm( pDoc->GetDfltFrmFmt(), this ) ); - - SizeChgNotify(); + // Create a new layout, if there is no one available + if( !pLayout ) + { + // Here's the code which disables the usage of "multiple" layouts at the moment + // If the problems with controls and groups objects are solved, + // this code can be removed... + ViewShell *pCurrShell = GetDoc()->GetCurrentViewShell(); + if( pCurrShell ) + pLayout = pCurrShell->pLayout; + // end of "disable multiple layouts" + if( !pLayout ) + { + // switched to two step construction because creating the layout in SwRootFrm needs a valid pLayout set + pLayout = SwRootFrmPtr(new SwRootFrm( pDoc->GetDfltFrmFmt(), this ));//swmod081016 + pLayout->Init( pDoc->GetDfltFrmFmt() ); + } + } + SizeChgNotify(); //swmod 071108 // #i31958# // XForms mode: initialize XForms mode, based on design mode (draw view) @@ -229,9 +240,8 @@ ViewShell::ViewShell( ViewShell& rShell, Window *pWindow, bPaintInProgress = bViewLocked = bInEndAction = bFrameView = bEndActionByVirDev = sal_False; bPreView = 0 !=( VSHELLFLAG_ISPREVIEW & nFlags ); - - if ( bPreView ) - pImp->InitPagePreviewLayout(); + if( nFlags & VSHELLFLAG_SHARELAYOUT ) //swmod 080125 + pLayout = rShell.pLayout;//swmod 080125 SET_CURR_SHELL( this ); @@ -242,6 +252,10 @@ ViewShell::ViewShell( ViewShell& rShell, Window *pWindow, Init( rShell.GetViewOptions() ); pOut = pOutput; + // OD 12.12.2002 #103492# + if ( bPreView ) + pImp->InitPagePreviewLayout(); + ((SwHiddenTxtFieldType*)pDoc->GetSysFldType( RES_HIDDENTXTFLD ))-> SetHiddenFlag( !pOpt->IsShowHiddenField() ); @@ -283,9 +297,8 @@ ViewShell::~ViewShell() { if( pGNd->IsAnimated() ) { - SwClientIter aIter( *pGNd ); - for( SwFrm* pFrm = (SwFrm*)aIter.First( TYPE(SwFrm) ); - pFrm; pFrm = (SwFrm*)aIter.Next() ) + SwIterator<SwFrm,SwGrfNode> aIter( *pGNd ); + for( SwFrm* pFrm = aIter.First(); pFrm; pFrm = aIter.Next() ) { OSL_ENSURE( pFrm->IsNoTxtFrm(), "GraphicNode with Text?" ); ((SwNoTxtFrm*)pFrm)->StopAnimation( pOut ); @@ -306,8 +319,8 @@ ViewShell::~ViewShell() if( !pDoc->release() ) delete pDoc, pDoc = 0; else - pDoc->GetRootFrm()->ResetNewLayout(); - } + GetLayout()->ResetNewLayout(); + }//swmod 080317 delete pOpt; @@ -320,7 +333,12 @@ ViewShell::~ViewShell() } if ( pDoc ) + { GetLayout()->DeRegisterShell( this ); + if(pDoc->GetCurrentViewShell()==this) + pDoc->SetCurrentViewShell( this->GetNext()!=this ? + (ViewShell*)this->GetNext() : NULL ); + } delete mpTmpRef; delete pAccOptions; @@ -328,7 +346,7 @@ ViewShell::~ViewShell() sal_Bool ViewShell::HasDrawView() const { - return Imp()->HasDrawView(); + return Imp() ? Imp()->HasDrawView() : 0; } void ViewShell::MakeDrawView() diff --git a/sw/source/core/view/vprint.cxx b/sw/source/core/view/vprint.cxx index ad2f92b9c1f6..ac62ba424ead 100644 --- a/sw/source/core/view/vprint.cxx +++ b/sw/source/core/view/vprint.cxx @@ -314,12 +314,12 @@ void ViewShell::CalcPagesForPrint( sal_uInt16 nMax ) { SET_CURR_SHELL( this ); - SwRootFrm* pLayout = GetLayout(); + SwRootFrm* pMyLayout = GetLayout(); - const SwFrm *pPage = pLayout->Lower(); - SwLayAction aAction( pLayout, Imp() ); + const SwFrm *pPage = pMyLayout->Lower(); + SwLayAction aAction( pMyLayout, Imp() ); - pLayout->StartAllAction(); + pMyLayout->StartAllAction(); for ( sal_uInt16 i = 1; pPage && i <= nMax; pPage = pPage->GetNext(), ++i ) { pPage->Calc(); @@ -337,7 +337,8 @@ void ViewShell::CalcPagesForPrint( sal_uInt16 nMax ) Imp()->SetFirstVisPageInvalid(); } - pLayout->EndAllAction(); + + pMyLayout->EndAllAction(); } /******************************************************************************/ @@ -374,7 +375,7 @@ SwDoc * ViewShell::FillPrtDoc( SwDoc *pPrtDoc, const SfxPrinter* pPrt) SwShellTableCrsr* pShellTblCrsr = pFESh->GetTableCrsr(); const SwCntntNode* pCntntNode = pShellTblCrsr->GetNode()->GetCntntNode(); - const SwCntntFrm *pCntntFrm = pCntntNode ? pCntntNode->GetFrm( 0, pShellTblCrsr->Start() ) : 0; + const SwCntntFrm *pCntntFrm = pCntntNode ? pCntntNode->getLayoutFrm( GetLayout(), 0, pShellTblCrsr->Start() ) : 0; if( pCntntFrm ) { SwRect aCharRect; @@ -549,10 +550,10 @@ void ViewShell::PrtOle2( SwDoc *pDoc, const SwViewOption *pOpt, const SwPrintDat OutputDevice* pOleOut, const Rectangle& rRect ) { ViewShell *pSh; - if( pDoc->GetRootFrm() && pDoc->GetRootFrm()->GetCurrShell() ) - pSh = new ViewShell( *pDoc->GetRootFrm()->GetCurrShell(), 0, pOleOut ); - else - pSh = new ViewShell( *pDoc, 0, pOpt, pOleOut ); + if( pDoc->GetCurrentViewShell() ) + pSh = new ViewShell( *pDoc->GetCurrentViewShell(), 0, pOleOut,VSHELLFLAG_SHARELAYOUT );//swmod 080129 + else //swmod 071108//swmod 071225 + pSh = new ViewShell( *pDoc, 0, pOpt, pOleOut);//swmod 080129 { SET_CURR_SHELL( pSh ); @@ -562,11 +563,11 @@ void ViewShell::PrtOle2( SwDoc *pDoc, const SwViewOption *pOpt, const SwPrintDat SwRect aSwRect( rRect ); pSh->aVisArea = aSwRect; - if ( pSh->getIDocumentSettingAccess()->get(IDocumentSettingAccess::BROWSE_MODE) && + if ( pSh->GetViewOptions()->getBrowseMode() && pSh->GetNext() == pSh ) { pSh->CheckBrowseView( sal_False ); - pDoc->GetRootFrm()->Lower()->InvalidateSize(); + pSh->GetLayout()->Lower()->InvalidateSize(); } // CalcPagesForPrint() should not be necessary here. The pages in the diff --git a/sw/source/filter/html/css1atr.cxx b/sw/source/filter/html/css1atr.cxx index 49b3af998897..8b741562b2e1 100644 --- a/sw/source/filter/html/css1atr.cxx +++ b/sw/source/filter/html/css1atr.cxx @@ -57,6 +57,7 @@ #include <editeng/spltitem.hxx> #include <editeng/orphitem.hxx> #include <svx/xoutbmp.hxx> +#include <svx/svdobj.hxx> #include <editeng/langitem.hxx> #include <editeng/frmdiritem.hxx> #include <svtools/htmlout.hxx> @@ -86,8 +87,6 @@ #include <txtftn.hxx> #include <fmtftn.hxx> // FOOTNOTES -#include <dcontact.hxx> - #include "doc.hxx" #include "swerror.h" #include "charatr.hxx" diff --git a/sw/source/filter/html/htmlforw.cxx b/sw/source/filter/html/htmlforw.cxx index 47ce516701f2..1c7c129a6573 100644 --- a/sw/source/filter/html/htmlforw.cxx +++ b/sw/source/filter/html/htmlforw.cxx @@ -68,12 +68,11 @@ #include "pam.hxx" #include "doc.hxx" #include "ndtxt.hxx" -#include "dcontact.hxx" #include "flypos.hxx" #include "wrthtml.hxx" #include "htmlfly.hxx" #include "htmlform.hxx" - +#include "frmfmt.hxx" using namespace ::com::sun::star; using ::rtl::OUString; diff --git a/sw/source/filter/html/htmltab.cxx b/sw/source/filter/html/htmltab.cxx index 1fe0e4898395..265e9234e3fc 100644 --- a/sw/source/filter/html/htmltab.cxx +++ b/sw/source/filter/html/htmltab.cxx @@ -5088,7 +5088,7 @@ void _TblSaveStruct::MakeTable( sal_uInt16 nWidth, SwPosition& rPos, SwDoc *pDoc SwTableNode *pTblNd = pTCntxt->GetTableNode(); OSL_ENSURE( pTblNd, "Wo ist der Tabellen-Node" ); - if( pDoc->GetRootFrm() && pTblNd ) + if( pDoc->GetCurrentViewShell() && pTblNd ) //swmod 071108//swmod 071225 { // Existiert schon ein Layout, dann muss an dieser Tabelle die // BoxFrames neu erzeugt werden. diff --git a/sw/source/filter/html/htmlvsh.hxx b/sw/source/filter/html/htmlvsh.hxx index 99343566048a..aa8159b3858e 100644 --- a/sw/source/filter/html/htmlvsh.hxx +++ b/sw/source/filter/html/htmlvsh.hxx @@ -35,7 +35,8 @@ class ViewShell; class SwHTMLViewShellClient : public SwClient { - virtual void Modify( SfxPoolItem *pOld, SfxPoolItem *pNew ); +protected: + virtual void Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew ); public: @@ -46,7 +47,7 @@ public: void Register( ViewShell *pVsh ); void DeRegister(); - /*inline*/ ViewShell *GetViewShell(); // im swhtml.cxx + ViewShell *GetViewShell(); }; diff --git a/sw/source/filter/html/swhtml.cxx b/sw/source/filter/html/swhtml.cxx index 88aaad70f09f..393787297392 100644 --- a/sw/source/filter/html/swhtml.cxx +++ b/sw/source/filter/html/swhtml.cxx @@ -924,15 +924,15 @@ if( pSttNdIdx->GetIndex()+1 == pPam->GetBound( sal_False ).nNode.GetIndex() ) #endif } -void SwHTMLParser::Modify( SfxPoolItem *pOld, SfxPoolItem *pNew ) +void SwHTMLParser::Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew ) { switch( pOld ? pOld->Which() : pNew ? pNew->Which() : 0 ) { case RES_OBJECTDYING: - if( ((SwPtrMsgPoolItem *)pOld)->pObject == pRegisteredIn ) + if( ((SwPtrMsgPoolItem *)pOld)->pObject == GetRegisteredIn() ) { // dann uns selbst beenden - pRegisteredIn->Remove( this ); + GetRegisteredInNonConst()->Remove( this ); ReleaseRef(); // ansonsten sind wir fertig! } break; diff --git a/sw/source/filter/html/swhtml.hxx b/sw/source/filter/html/swhtml.hxx index ae072aa7ec2e..0df5b3923f79 100644 --- a/sw/source/filter/html/swhtml.hxx +++ b/sw/source/filter/html/swhtml.hxx @@ -920,7 +920,7 @@ protected: virtual ~SwHTMLParser(); // wird das Dok geloescht, ist auch der Parser zu loeschen - virtual void Modify( SfxPoolItem *pOld, SfxPoolItem *pNew ); + virtual void Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew ); virtual void AddMetaUserDefined( ::rtl::OUString const & i_rMetaName ); diff --git a/sw/source/filter/inc/fltshell.hxx b/sw/source/filter/inc/fltshell.hxx index 61208b30c445..91647089d1cb 100644 --- a/sw/source/filter/inc/fltshell.hxx +++ b/sw/source/filter/inc/fltshell.hxx @@ -167,7 +167,7 @@ class SwFltAnchorClient : public SwClient public: SwFltAnchorClient(SwFltAnchor * pFltAnchor); - virtual void Modify (SfxPoolItem *pOld, SfxPoolItem *pNew); + virtual void Modify (const SfxPoolItem *pOld, const SfxPoolItem *pNew); }; diff --git a/sw/source/filter/rtf/rtfnum.cxx b/sw/source/filter/rtf/rtfnum.cxx index 5552ed7c5cb5..b91c26d1c763 100644 --- a/sw/source/filter/rtf/rtfnum.cxx +++ b/sw/source/filter/rtf/rtfnum.cxx @@ -673,7 +673,7 @@ void SwRTFParser::RemoveUnusedNumRule( SwNumRule* pRule ) SwCharFmt* pCFmt = rNFmt.GetCharFmt(); if( pCFmt ) { - pCFmt->Remove( &rNFmt ); + rNFmt.ForgetCharFmt(); if( !pCFmt->GetDepends() ) pDoc->DelCharFmt( pCFmt ); } diff --git a/sw/source/filter/rtf/rtftbl.cxx b/sw/source/filter/rtf/rtftbl.cxx index 5adb998937a9..aac3ef89132d 100644 --- a/sw/source/filter/rtf/rtftbl.cxx +++ b/sw/source/filter/rtf/rtftbl.cxx @@ -710,9 +710,9 @@ void SwRTFParser::ReadTable( int nToken ) { SwTableBox* pBox = pNewLine->GetTabBoxes()[0]; pBoxFmt = (SwTableBoxFmt*)pBox->GetFrmFmt(); - pBoxFmt->Remove( pBox ); + pBox->ForgetFrmFmt(); delete pBoxFmt; - aBoxFmts[0]->Add( pBox ); + pBox->RegisterToFormat( *aBoxFmts[0] ); SwTxtNode* pTNd = pDoc->GetNodes()[ pBox->GetSttIdx()+1 ] ->GetTxtNode(); OSL_ENSURE( pTNd, "wo ist der Textnode dieser Box?" ); diff --git a/sw/source/filter/rtf/swparrtf.cxx b/sw/source/filter/rtf/swparrtf.cxx index 91d9543609f4..56df822e16dd 100644 --- a/sw/source/filter/rtf/swparrtf.cxx +++ b/sw/source/filter/rtf/swparrtf.cxx @@ -1050,11 +1050,11 @@ InsertedTableClient::InsertedTableClient(SwTableNode & rNode) SwTableNode * InsertedTableClient::GetTableNode() { - return dynamic_cast<SwTableNode *> (pRegisteredIn); + return dynamic_cast<SwTableNode *> (GetRegisteredInNonConst()); } InsertedTablesManager::InsertedTablesManager(const SwDoc &rDoc) - : mbHasRoot(rDoc.GetRootFrm()) + : mbHasRoot(rDoc.GetCurrentLayout()) //swmod 080218 { } diff --git a/sw/source/filter/ww1/fltshell.cxx b/sw/source/filter/ww1/fltshell.cxx index 9e16b86bb583..91d67441286e 100644 --- a/sw/source/filter/ww1/fltshell.cxx +++ b/sw/source/filter/ww1/fltshell.cxx @@ -428,7 +428,7 @@ void SwFltControlStack::SetAttrInDoc(const SwPosition& rTmpPos, SwFltStackEntry* pFmt->SetFmtAttr(aAnchor); // Damit die Frames bei Einfuegen in existierendes Doc // erzeugt werden (erst nach Setzen des Ankers!): - if(pDoc->GetRootFrm() + if(pDoc->GetCurrentViewShell() //swmod 071108//swmod 071225 && (FLY_AT_PARA == pFmt->GetAnchor().GetAnchorId())) { pFmt->MakeFrms(); @@ -772,11 +772,11 @@ SwFltAnchorClient::SwFltAnchorClient(SwFltAnchor * pFltAnchor) { } -void SwFltAnchorClient::Modify(SfxPoolItem *, SfxPoolItem * pNew) +void SwFltAnchorClient::Modify(const SfxPoolItem *, const SfxPoolItem * pNew) { if (pNew->Which() == RES_FMT_CHG) { - SwFmtChg * pFmtChg = dynamic_cast<SwFmtChg *> (pNew); + const SwFmtChg * pFmtChg = dynamic_cast<const SwFmtChg *> (pNew); if (pFmtChg != NULL) { @@ -1600,7 +1600,7 @@ void SwFltOutDoc::EndTable() rStack.SetAttr( *pPaM->GetPoint(), 0, sal_False ); rEndStack.SetAttr( *pPaM->GetPoint(), 0, sal_False ); - if (GetDoc().GetRootFrm()){ + if (GetDoc().GetCurrentViewShell()){ //swmod 071108//swmod 071225 SwTableNode* pTableNode = GetDoc().IsIdxInTbl( pPaM->GetPoint()->nNode); pTableNode->DelFrms(); diff --git a/sw/source/filter/ww8/rtfexport.cxx b/sw/source/filter/ww8/rtfexport.cxx index c4d2e906e797..da30b43553b3 100644..100755 --- a/sw/source/filter/ww8/rtfexport.cxx +++ b/sw/source/filter/ww8/rtfexport.cxx @@ -1265,7 +1265,7 @@ void RtfExport::WriteHeaderFooter(const SwFrmFmt& rFmt, bool bHeader, const sal_ class SwRTFWriter : public Writer { private: - bool bOutOutlineOnly; + bool m_bOutOutlineOnly; public: SwRTFWriter( const String& rFilterName, const String& rBaseURL ); @@ -1277,7 +1277,8 @@ SwRTFWriter::SwRTFWriter( const String& rFltName, const String & rBaseURL ) { OSL_TRACE("%s", OSL_THIS_FUNC); SetBaseURL( rBaseURL ); - bOutOutlineOnly = 'O' == rFltName.GetChar( 0 ); + // export outline nodes, only (send outline to clipboard/presentation) + m_bOutOutlineOnly = 'O' == rFltName.GetChar( 0 ); } SwRTFWriter::~SwRTFWriter() @@ -1286,7 +1287,7 @@ SwRTFWriter::~SwRTFWriter() sal_uLong SwRTFWriter::WriteStream() { OSL_TRACE("%s", OSL_THIS_FUNC); - RtfExport aExport( NULL, pDoc, new SwPaM( *pCurPam->End(), *pCurPam->Start() ), pCurPam, this, bOutOutlineOnly ); + RtfExport aExport( NULL, pDoc, new SwPaM( *pCurPam->End(), *pCurPam->Start() ), pCurPam, this, m_bOutOutlineOnly ); aExport.ExportDocument( true ); return 0; } diff --git a/sw/source/filter/ww8/rtfexport.hxx b/sw/source/filter/ww8/rtfexport.hxx index 60b6c347ae0c..60b6c347ae0c 100644..100755 --- a/sw/source/filter/ww8/rtfexport.hxx +++ b/sw/source/filter/ww8/rtfexport.hxx diff --git a/sw/source/filter/ww8/wrtw8esh.cxx b/sw/source/filter/ww8/wrtw8esh.cxx index fc5593b2a8db..df5c897ae684 100644 --- a/sw/source/filter/ww8/wrtw8esh.cxx +++ b/sw/source/filter/ww8/wrtw8esh.cxx @@ -2066,7 +2066,7 @@ bool WinwordAnchoring::ConvertPosition( SwFmtHoriOrient& _iorHoriOri, const SwContact* pContact = _rFrmFmt.FindContactObj(); if ( pContact ) { - std::vector<SwAnchoredObject*> aAnchoredObjs; + std::list<SwAnchoredObject*> aAnchoredObjs; pContact->GetAnchoredObjs( aAnchoredObjs ); if ( !aAnchoredObjs.empty() ) { diff --git a/sw/source/filter/ww8/wrtw8nds.cxx b/sw/source/filter/ww8/wrtw8nds.cxx index d9f8c318ba0a..764b5438607f 100644..100755 --- a/sw/source/filter/ww8/wrtw8nds.cxx +++ b/sw/source/filter/ww8/wrtw8nds.cxx @@ -108,6 +108,7 @@ #include <ndgrf.hxx> #include <ndole.hxx> + #include <cstdio> using namespace ::com::sun::star; @@ -516,7 +517,7 @@ void SwWW8AttrIter::OutAttr( xub_StrLen nSwPos, bool bRuby ) characters. */ if ( !m_rExport.SupportsUnicode() ) - aFont.GetCharSet() = GetCharSet(); + aFont.SetCharSet( GetCharSet() ); if ( rParentFont != aFont ) m_rExport.AttrOutput().OutputItem( aFont ); @@ -1608,12 +1609,13 @@ xub_StrLen MSWordExportBase::GetNextPos( SwWW8AttrIter* aAttrIter, const SwTxtNo { // Get the bookmarks for the normal run xub_StrLen nNextPos = aAttrIter->WhereNext(); - - GetSortedBookmarks( rNode, nAktPos, nNextPos - nAktPos ); - xub_StrLen nNextBookmark = nNextPos; - NearestBookmark( nNextPos, nAktPos, false ); + if( nNextBookmark > nAktPos )//no need to search for bookmarks otherwise + { + GetSortedBookmarks( rNode, nAktPos, nNextBookmark - nAktPos ); + NearestBookmark( nNextBookmark, nAktPos, false ); + } return std::min( nNextPos, nNextBookmark ); } @@ -1621,9 +1623,9 @@ void MSWordExportBase::UpdatePosition( SwWW8AttrIter* aAttrIter, xub_StrLen nAkt { xub_StrLen nNextPos; - // go to next attribute if no bookmark is found of if the bookmark is behind the next attribute position + // go to next attribute if no bookmark is found and if the next attribute position if at the current position bool bNextBookmark = NearestBookmark( nNextPos, nAktPos, true ); - if( !bNextBookmark || nNextPos < aAttrIter->WhereNext() ) + if( !bNextBookmark && nAktPos >= aAttrIter->WhereNext() ) aAttrIter->NextPos(); } @@ -2032,8 +2034,8 @@ void MSWordExportBase::OutputTextNode( const SwTxtNode& rNode ) if (pTextNodeInfoInner->isFirstInTable()) { const SwTable * pTable = pTextNodeInfoInner->getTable(); - const SwTableFmt * pTabFmt = - dynamic_cast<const SwTableFmt *>(pTable->GetRegisteredIn()); + + const SwTableFmt * pTabFmt = pTable->GetTableFmt(); if (pTabFmt != NULL) { if (pTabFmt->GetBreak().GetBreak() == SVX_BREAK_PAGE_BEFORE) @@ -2246,7 +2248,7 @@ void MSWordExportBase::OutputTextNode( const SwTxtNode& rNode ) // this has to be overruled. const SwFmtPageDesc& rPageDescAtParaStyle = ItemGet<SwFmtPageDesc>( rNode, RES_PAGEDESC ); - if( rPageDescAtParaStyle.GetRegisteredIn() ) + if( rPageDescAtParaStyle.KnowsPageDesc() ) pTmpSet->ClearItem( RES_BREAK ); } } @@ -2734,8 +2736,12 @@ void MSWordExportBase::OutputContentNode( const SwCntntNode& rNode ) switch ( rNode.GetNodeType() ) { case ND_TEXTNODE: - OutputTextNode( *rNode.GetTxtNode() ); - break; + { + const SwTxtNode& rTextNode = *rNode.GetTxtNode(); + if( !mbOutOutlineOnly || rTextNode.IsOutline() ) + OutputTextNode( rTextNode ); + } + break; case ND_GRFNODE: OutputGrfNode( *rNode.GetGrfNode() ); break; diff --git a/sw/source/filter/ww8/wrtww8.cxx b/sw/source/filter/ww8/wrtww8.cxx index 9f63574adfd5..fe160b9493fe 100644 --- a/sw/source/filter/ww8/wrtww8.cxx +++ b/sw/source/filter/ww8/wrtww8.cxx @@ -2092,7 +2092,7 @@ void WW8AttributeOutput::TableOrientation( ww8::WW8TableNodeInfoInner::Pointer_t void WW8AttributeOutput::TableSpacing(ww8::WW8TableNodeInfoInner::Pointer_t pTableTextNodeInfoInner) { const SwTable * pTable = pTableTextNodeInfoInner->getTable(); - const SwTableFmt * pTableFmt = dynamic_cast<const SwTableFmt *>(pTable->GetRegisteredIn()); + const SwTableFmt * pTableFmt = pTable->GetTableFmt(); if (pTableFmt != NULL) { @@ -3330,6 +3330,7 @@ MSWordExportBase::MSWordExportBase( SwDoc *pDocument, SwPaM *pCurrentPam, SwPaM pStyles( NULL ), bHasHdr(false), bHasFtr(false), bSubstituteBullets(true), mbExportModeRTF( false ), + mbOutOutlineOnly( false ), pDoc( pDocument ), pCurPam( pCurrentPam ), pOrigPam( pOriginalPam ) diff --git a/sw/source/filter/ww8/wrtww8.hxx b/sw/source/filter/ww8/wrtww8.hxx index a3a42d923386..ce9da3f26873 100644 --- a/sw/source/filter/ww8/wrtww8.hxx +++ b/sw/source/filter/ww8/wrtww8.hxx @@ -551,6 +551,7 @@ public: sal_uInt8 bSubstituteBullets : 1; // true: SubstituteBullet() gets called bool mbExportModeRTF; + bool mbOutOutlineOnly; // export outline nodes, only (send outline to clipboard/presentation) SwDoc *pDoc; SwPaM *pCurPam, *pOrigPam; diff --git a/sw/source/filter/ww8/ww8atr.cxx b/sw/source/filter/ww8/ww8atr.cxx index 9690e38f0b2f..55808fefc1aa 100644 --- a/sw/source/filter/ww8/ww8atr.cxx +++ b/sw/source/filter/ww8/ww8atr.cxx @@ -326,21 +326,19 @@ void MSWordExportBase::OutputItemSet( const SfxItemSet& rSet, bool bPapFmt, bool pISet = 0; // fuer Doppel-Attribute } } - +#include "switerator.hxx" void MSWordExportBase::GatherChapterFields() { //If the header/footer contains a chapter field - SwClientIter aIter(*pDoc->GetSysFldType(RES_CHAPTERFLD)); - const SwClient *pField = aIter.First(TYPE(SwFmtFld)); - while (pField) + SwFieldType* pType = pDoc->GetSysFldType( RES_CHAPTERFLD ); + SwIterator<SwFmtFld,SwFieldType> aFmtFlds( *pType ); + for ( SwFmtFld* pFld = aFmtFlds.First(); pFld; pFld = aFmtFlds.Next() ) { - const SwFmtFld* pFld = (const SwFmtFld*)(pField); if (const SwTxtFld *pTxtFld = pFld->GetTxtFld()) { const SwTxtNode &rTxtNode = pTxtFld->GetTxtNode(); maChapterFieldLocs.push_back(rTxtNode.GetIndex()); } - pField = aIter.Next(); } } @@ -442,7 +440,7 @@ void MSWordExportBase::OutputSectionBreaks( const SfxItemSet *pSet, const SwNode if ( pSet && pSet->Count() ) { if ( SFX_ITEM_SET == pSet->GetItemState( RES_PAGEDESC, false, &pItem ) - && ( (SwFmtPageDesc*)pItem )->GetRegisteredIn() ) + && ( (SwFmtPageDesc*)pItem )->KnowsPageDesc() ) { bBreakSet = true; bNewPageDesc = true; @@ -524,7 +522,7 @@ void MSWordExportBase::OutputSectionBreaks( const SfxItemSet *pSet, const SwNode // but a pagedesc item is an implicit page break before... const SwFmtPageDesc &rPageDesc = ItemGet<SwFmtPageDesc>( *pNd, RES_PAGEDESC ); - if ( rPageDesc.GetRegisteredIn() ) + if ( rPageDesc.KnowsPageDesc() ) bHackInBreak = true; } } @@ -856,10 +854,10 @@ void MSWordExportBase::OutputFormat( const SwFmt& rFmt, bool bPapFmt, bool bChpF bool MSWordExportBase::HasRefToObject( sal_uInt16 nTyp, const String* pName, sal_uInt16 nSeqNo ) { const SwTxtNode* pNd; - SwClientIter aIter( *pDoc->GetSysFldType( RES_GETREFFLD ) ); - for ( SwFmtFld* pFld = static_cast< SwFmtFld* >( aIter.First( TYPE( SwFmtFld ) ) ); - pFld; - pFld = static_cast< SwFmtFld* >( aIter.Next() ) ) + + SwFieldType* pType = pDoc->GetSysFldType( RES_GETREFFLD ); + SwIterator<SwFmtFld, SwFieldType> aFmtFlds( *pType ); + for ( SwFmtFld* pFld = aFmtFlds.First(); pFld; pFld = aFmtFlds.Next() ) { if ( pFld->GetTxtFld() && nTyp == pFld->GetFld()->GetSubType() && 0 != ( pNd = pFld->GetTxtFld()->GetpTxtNode() ) && @@ -3532,7 +3530,7 @@ void AttributeOutputBase::FormatPageDescription( const SwFmtPageDesc& rPageDesc if ( GetExport().bStyDef && GetExport().pOutFmtNode && GetExport().pOutFmtNode->ISA( SwTxtFmtColl ) ) { const SwTxtFmtColl* pC = (SwTxtFmtColl*)GetExport().pOutFmtNode; - if ( (SFX_ITEM_SET != pC->GetItemState( RES_BREAK, false ) ) && rPageDesc.GetRegisteredIn() ) + if ( (SFX_ITEM_SET != pC->GetItemState( RES_BREAK, false ) ) && rPageDesc.KnowsPageDesc() ) FormatBreak( SvxFmtBreakItem( SVX_BREAK_PAGE_BEFORE, RES_BREAK ) ); } } diff --git a/sw/source/filter/ww8/ww8graf2.cxx b/sw/source/filter/ww8/ww8graf2.cxx index 2bd9ab8b5681..0a8a99510fe0 100644 --- a/sw/source/filter/ww8/ww8graf2.cxx +++ b/sw/source/filter/ww8/ww8graf2.cxx @@ -41,7 +41,6 @@ #include <sfx2/app.hxx> #include <sfx2/docfile.hxx> #include <sfx2/fcontnr.hxx> -#include <dcontact.hxx> #include <grfatr.hxx> // class SwCropGrf #include <fmtflcnt.hxx> #include <fmtanchr.hxx> @@ -388,7 +387,7 @@ SwFlyFrmFmt* SwWW8ImplReader::MakeGrafNotInCntnt(const WW8PicDesc& rPD, &aFlySet, &rGrfSet, NULL); // Damit die Frames bei Einfuegen in existierendes Doc erzeugt werden: - if (rDoc.GetRootFrm() && + if (rDoc.GetCurrentViewShell() && //swmod 071108//swmod 071225 (FLY_AT_PARA == pFlyFmt->GetAnchor().GetAnchorId())) { pFlyFmt->MakeFrms(); diff --git a/sw/source/filter/ww8/ww8par5.cxx b/sw/source/filter/ww8/ww8par5.cxx index be19f7453432..e8a1d22f06ce 100644 --- a/sw/source/filter/ww8/ww8par5.cxx +++ b/sw/source/filter/ww8/ww8par5.cxx @@ -2761,7 +2761,7 @@ void lcl_toxMatchACSwitch( SwWW8ImplReader& /*rReader*/, if( STRING_NOTFOUND != n ) { SwTOXType* pType = (SwTOXType*)rDoc.GetTOXType( TOX_ILLUSTRATIONS, 0); - pType->Add( &rBase ); + rBase.RegisterToTOXType( *pType ); rBase.SetCaptionDisplay( eCaptionType ); // Read Sequence Name and store in TOXBase String sSeqName( rParam.GetResult() ); diff --git a/sw/source/filter/xml/XMLRedlineImportHelper.cxx b/sw/source/filter/xml/XMLRedlineImportHelper.cxx index ade7d08baf9c..1a1f1ed4aa2b 100644 --- a/sw/source/filter/xml/XMLRedlineImportHelper.cxx +++ b/sw/source/filter/xml/XMLRedlineImportHelper.cxx @@ -71,21 +71,22 @@ using ::com::sun::star::beans::XPropertySetInfo; SwDoc* lcl_GetDocViaTunnel( Reference<XTextCursor> & rCursor ) { Reference<XUnoTunnel> xTunnel( rCursor, UNO_QUERY); - OSL_ENSURE( xTunnel.is(), "missing XUnoTunnel for Cursor" ); - OTextCursorHelper* pSwXCursor = reinterpret_cast< OTextCursorHelper * >( - sal::static_int_cast< sal_IntPtr >(xTunnel->getSomething(OTextCursorHelper::getUnoTunnelId())) ); - OSL_ENSURE( NULL != pSwXCursor, "OTextCursorHelper missing" ); - return pSwXCursor->GetDoc(); + OSL_ENSURE(xTunnel.is(), "missing XUnoTunnel for XTextCursor"); + OTextCursorHelper *const pXCursor = + ::sw::UnoTunnelGetImplementation<OTextCursorHelper>(xTunnel); + OSL_ENSURE( pXCursor, "OTextCursorHelper missing" ); + return (pXCursor) ? pXCursor->GetDoc() : 0; } SwDoc* lcl_GetDocViaTunnel( Reference<XTextRange> & rRange ) { Reference<XUnoTunnel> xTunnel(rRange, UNO_QUERY); - OSL_ENSURE(xTunnel.is(), "Can't tunnel XTextRange"); - SwXTextRange *pRange = reinterpret_cast< SwXTextRange *>( - sal::static_int_cast< sal_IntPtr >(xTunnel->getSomething(SwXTextRange::getUnoTunnelId())) ); - OSL_ENSURE( NULL != pRange, "SwXTextRange missing" ); - return pRange->GetDoc(); + OSL_ENSURE(xTunnel.is(), "missing XUnoTunnel for XTextRange"); + SwXTextRange *const pXRange = + ::sw::UnoTunnelGetImplementation<SwXTextRange>(xTunnel); + // #i115174#: this may be a SvxUnoTextRange +// OSL_ENSURE( pXRange, "SwXTextRange missing" ); + return (pXRange) ? pXRange->GetDoc() : 0; } @@ -112,7 +113,7 @@ public: void Set( SwNodeIndex& rIndex ); void SetAsNodeIndex( Reference<XTextRange> & rRange ); - void CopyPositionInto(SwPosition& rPos); + void CopyPositionInto(SwPosition& rPos, SwDoc & rDoc); SwDoc* GetDoc(); sal_Bool IsValid(); @@ -155,6 +156,12 @@ void XTextRangeOrNodeIndexPosition::SetAsNodeIndex( // XTextRange -> XTunnel -> SwXTextRange SwDoc* pDoc = lcl_GetDocViaTunnel(rRange); + if (!pDoc) + { + OSL_TRACE("SetAsNodeIndex: no SwDoc"); + return; + } + // SwXTextRange -> PaM SwUnoInternalPaM aPaM(*pDoc); #if OSL_DEBUG_LEVEL > 0 @@ -167,14 +174,15 @@ void XTextRangeOrNodeIndexPosition::SetAsNodeIndex( Set(aPaM.GetPoint()->nNode); } -void XTextRangeOrNodeIndexPosition::CopyPositionInto(SwPosition& rPos) +void +XTextRangeOrNodeIndexPosition::CopyPositionInto(SwPosition& rPos, SwDoc & rDoc) { OSL_ENSURE(IsValid(), "Can't get Position"); // create PAM from start cursor (if no node index is present) if (NULL == pIndex) { - SwUnoInternalPaM aUnoPaM(*GetDoc()); + SwUnoInternalPaM aUnoPaM(rDoc); #if OSL_DEBUG_LEVEL > 0 sal_Bool bSuccess = #endif @@ -480,6 +488,13 @@ Reference<XTextCursor> XMLRedlineImportHelper::CreateRedlineTextSection( // get document from old cursor (via tunnel) SwDoc* pDoc = lcl_GetDocViaTunnel(xOldCursor); + if (!pDoc) + { + OSL_TRACE("XMLRedlineImportHelper::CreateRedlineTextSection: " + "no SwDoc => cannot create section."); + return 0; + } + // create text section for redline SwTxtFmtColl *pColl = pDoc->GetTxtCollFromPool (RES_POOLCOLL_STANDARD, false ); @@ -612,11 +627,18 @@ void XMLRedlineImportHelper::InsertIntoDocument(RedlineInfo* pRedlineInfo) // get the document (from one of the positions) SwDoc* pDoc = pRedlineInfo->aAnchorStart.GetDoc(); + if (!pDoc) + { + OSL_TRACE("XMLRedlineImportHelper::InsertIntoDocument: " + "no SwDoc => cannot insert redline."); + return; + } + // now create the PaM for the redline SwPaM aPaM(pDoc->GetNodes().GetEndOfContent()); - pRedlineInfo->aAnchorStart.CopyPositionInto(*aPaM.GetPoint()); + pRedlineInfo->aAnchorStart.CopyPositionInto(*aPaM.GetPoint(), *pDoc); aPaM.SetMark(); - pRedlineInfo->aAnchorEnd.CopyPositionInto(*aPaM.GetPoint()); + pRedlineInfo->aAnchorEnd.CopyPositionInto(*aPaM.GetPoint(), *pDoc); // collapse PaM if (start == end) if (*aPaM.GetPoint() == *aPaM.GetMark()) diff --git a/sw/source/filter/xml/wrtxml.cxx b/sw/source/filter/xml/wrtxml.cxx index a6bbc52d92ad..0a32e8f07d8b 100644 --- a/sw/source/filter/xml/wrtxml.cxx +++ b/sw/source/filter/xml/wrtxml.cxx @@ -439,7 +439,7 @@ pGraphicHelper = SvXMLGraphicHelper::Create( xStg, } } - if( pDoc->GetRootFrm() && pDoc->GetDocStat().nPage > 1 && + if( pDoc->GetCurrentViewShell() && pDoc->GetDocStat().nPage > 1 && //swmod 071108//swmod 071225 !(bOrganizerMode || bBlock || bErr) ) { OUString sStreamName( RTL_CONSTASCII_USTRINGPARAM("layout-cache") ); diff --git a/sw/source/filter/xml/xmlexp.cxx b/sw/source/filter/xml/xmlexp.cxx index ad314a6a1177..4820b9f11a3d 100644 --- a/sw/source/filter/xml/xmlexp.cxx +++ b/sw/source/filter/xml/xmlexp.cxx @@ -52,6 +52,7 @@ #include <doc.hxx> #include <swmodule.hxx> #include <docsh.hxx> +#include <viewsh.hxx> #include <docstat.hxx> #include <swerror.h> #include <unotext.hxx> @@ -579,7 +580,8 @@ void SwXMLExport::SetBodyAttributes() if( pText ) { SwDoc *pDoc = pText->GetDoc(); - if( pDoc && pDoc->GetPageCount() > 1 ) + if( pDoc && pDoc->GetCurrentViewShell() && + pDoc->GetCurrentViewShell()->GetPageCount() > 1 ) { sal_Bool bValue = sal_True; rtl::OUStringBuffer sBuffer; diff --git a/sw/source/filter/xml/xmlfmt.cxx b/sw/source/filter/xml/xmlfmt.cxx index 43b203637673..10780d5cf88b 100644 --- a/sw/source/filter/xml/xmlfmt.cxx +++ b/sw/source/filter/xml/xmlfmt.cxx @@ -701,7 +701,7 @@ void SwXMLItemSetStyleContext_Impl::ConnectPageDesc() if( pFmtPageDesc ) { - pPageDesc->Add( pFmtPageDesc ); + pFmtPageDesc->RegisterToPageDesc( *pPageDesc ); pItemSet->Put( *pFmtPageDesc ); delete pFmtPageDesc; } @@ -1082,7 +1082,7 @@ void SwXMLImport::UpdateTxtCollConditions( SwDoc *pDoc ) if( bSendModify ) { SwCondCollCondChg aMsg( pColl ); - pColl->Modify( &aMsg, &aMsg ); + pColl->ModifyNotification( &aMsg, &aMsg ); } } } diff --git a/sw/source/filter/xml/xmltbli.cxx b/sw/source/filter/xml/xmltbli.cxx index fafa66f926e4..db85d42b1d9f 100644 --- a/sw/source/filter/xml/xmltbli.cxx +++ b/sw/source/filter/xml/xmltbli.cxx @@ -2832,7 +2832,7 @@ void SwXMLTableContext::MakeTable() } // ??? this is always false: root frame is only created in ViewShell::Init - if( pTableNode->GetDoc()->GetRootFrm() ) + if( pTableNode->GetDoc()->GetCurrentViewShell() ) //swmod 071108//swmod 071225 { pTableNode->DelFrms(); SwNodeIndex aIdx( *pTableNode->EndOfSectionNode(), 1 ); diff --git a/sw/source/filter/xml/xmltexti.cxx b/sw/source/filter/xml/xmltexti.cxx index 3eed5ae93a8f..57046f9b1a95 100644 --- a/sw/source/filter/xml/xmltexti.cxx +++ b/sw/source/filter/xml/xmltexti.cxx @@ -64,6 +64,7 @@ #include <ndole.hxx> #include <docsh.hxx> #include <sfx2/docfile.hxx> +#include <switerator.hxx> // for locking SolarMutex: svapp + mutex #include <vcl/svapp.hxx> @@ -321,9 +322,8 @@ uno::Reference< XPropertySet > SwXMLTextImportHelper::createAndInsertOLEObject( { // check whether an object with this name already exists in the document String aName; - SwClientIter aIter( *(SwModify*)pDoc->GetDfltGrfFmtColl() ); - for( SwCntntNode* pNd = (SwCntntNode*)aIter.First( TYPE( SwCntntNode ) ); - pNd; pNd = (SwCntntNode*)aIter.Next() ) + SwIterator<SwCntntNode,SwFmtColl> aIter( *pDoc->GetDfltGrfFmtColl() ); + for( SwCntntNode* pNd = aIter.First(); pNd; pNd = aIter.Next() ) { SwOLENode* pExistingOLENd = pNd->GetOLENode(); if( pExistingOLENd ) diff --git a/sw/source/ui/app/apphdl.cxx b/sw/source/ui/app/apphdl.cxx index 21d46c39dfd7..0183d955ea18 100644 --- a/sw/source/ui/app/apphdl.cxx +++ b/sw/source/ui/app/apphdl.cxx @@ -694,6 +694,20 @@ void SwModule::Notify( SfxBroadcaster& /*rBC*/, const SfxHint& rHint ) SwWrtShell* pWrtSh = pDocSh ? pDocSh->GetWrtShell() : 0; switch( rEvHint.GetEventId() ) { + case SFX_EVENT_LOADFINISHED: + OSL_ASSERT(!pWrtSh); + // if it is a new document created from a template, + // update fixed fields + if (pDocSh->GetMedium()) + { + SFX_ITEMSET_ARG( pDocSh->GetMedium()->GetItemSet(), + pTemplateItem, SfxBoolItem, + SID_TEMPLATE, sal_False); + if (pTemplateItem && pTemplateItem->GetValue()) + { + pDocSh->GetDoc()->SetFixFields(false, 0); + } + } case SFX_EVENT_CREATEDOC: // Update all FIX-Date/Time fields if( pWrtSh ) @@ -702,7 +716,6 @@ void SwModule::Notify( SfxBroadcaster& /*rBC*/, const SfxHint& rHint ) sal_Bool bUpdateFields = sal_True; if( pUpdateDocItem && pUpdateDocItem->GetValue() == document::UpdateDocMode::NO_UPDATE) bUpdateFields = sal_False; - pWrtSh->SetFixFields(); if(bUpdateFields) { pWrtSh->UpdateInputFlds(); diff --git a/sw/source/ui/app/docsh.cxx b/sw/source/ui/app/docsh.cxx index 1443ce971aa8..fb182605cecb 100644 --- a/sw/source/ui/app/docsh.cxx +++ b/sw/source/ui/app/docsh.cxx @@ -94,8 +94,6 @@ #include <swcli.hxx> #include <txtftn.hxx> #include <ftnidx.hxx> - -// #i20883# Digital Signatures and Encryption #include <fldbas.hxx> #include <docary.hxx> #include <swerror.h> // Error messages @@ -122,7 +120,7 @@ #include <unomid.h> #include <sfx2/Metadatable.hxx> - +#include <switerator.hxx> using rtl::OUString; using namespace ::com::sun::star; @@ -932,17 +930,16 @@ sal_uInt16 SwDocShell::GetHiddenInformationState( sal_uInt16 nStates ) if ( GetWrtShell() ) { SwFieldType* pType = GetWrtShell()->GetFldType( RES_POSTITFLD, aEmptyStr ); - SwClientIter aIter( *pType ); - SwClient* pFirst = aIter.GoStart(); + SwIterator<SwFmtFld,SwFieldType> aIter( *pType ); + SwFmtFld* pFirst = aIter.First(); while( pFirst ) { - if( static_cast<SwFmtFld*>(pFirst)->GetTxtFld() && - static_cast<SwFmtFld*>(pFirst)->IsFldInDoc() ) + if( pFirst->GetTxtFld() && pFirst->IsFldInDoc() ) { nState |= HIDDENINFORMATION_NOTES; break; } - pFirst = ++aIter; + pFirst = aIter.Next(); } } } @@ -963,13 +960,14 @@ void SwDocShell::GetState(SfxItemSet& rSet) case SID_PRINTPREVIEW: { sal_Bool bDisable = IsInPlaceActive(); + // Disable "multiple layout" if ( !bDisable ) { SfxViewFrame *pTmpFrm = SfxViewFrame::GetFirst(this); while (pTmpFrm) // Look for Preview { if ( PTR_CAST(SwView, pTmpFrm->GetViewShell()) && - ((SwView*)pTmpFrm->GetViewShell())->GetWrtShell().getIDocumentSettingAccess()->get(IDocumentSettingAccess::BROWSE_MODE)) + ((SwView*)pTmpFrm->GetViewShell())->GetWrtShell().GetViewOptions()->getBrowseMode() ) { bDisable = sal_True; break; @@ -977,6 +975,7 @@ void SwDocShell::GetState(SfxItemSet& rSet) pTmpFrm = pTmpFrm->GetNext(*pTmpFrm, this); } } + // End of disabled "multiple layout" if ( bDisable ) rSet.DisableItem( SID_PRINTPREVIEW ); else @@ -1162,9 +1161,8 @@ SwFEShell* SwDocShell::GetFEShell() void SwDocShell::RemoveOLEObjects() { - SwClientIter aIter( *(SwModify*)pDoc->GetDfltGrfFmtColl() ); - for( SwCntntNode* pNd = (SwCntntNode*)aIter.First( TYPE( SwCntntNode ) ); - pNd; pNd = (SwCntntNode*)aIter.Next() ) + SwIterator<SwCntntNode,SwFmtColl> aIter( *pDoc->GetDfltGrfFmtColl() ); + for( SwCntntNode* pNd = aIter.First(); pNd; pNd = aIter.Next() ) { SwOLENode* pOLENd = pNd->GetOLENode(); if( pOLENd && ( pOLENd->IsOLEObjectDeleted() || @@ -1191,9 +1189,8 @@ void SwDocShell::CalcLayoutForOLEObjects() if( !pWrtShell ) return; - SwClientIter aIter( *(SwModify*)pDoc->GetDfltGrfFmtColl() ); - for( SwCntntNode* pNd = (SwCntntNode*)aIter.First( TYPE( SwCntntNode ) ); - pNd; pNd = (SwCntntNode*)aIter.Next() ) + SwIterator<SwCntntNode,SwFmtColl> aIter( *pDoc->GetDfltGrfFmtColl() ); + for( SwCntntNode* pNd = aIter.First(); pNd; pNd = aIter.Next() ) { SwOLENode* pOLENd = pNd->GetOLENode(); if( pOLENd && pOLENd->IsOLESizeInvalid() ) diff --git a/sw/source/ui/app/docsh2.cxx b/sw/source/ui/app/docsh2.cxx index 85a7bd82f81e..b8d9593178ec 100644 --- a/sw/source/ui/app/docsh2.cxx +++ b/sw/source/ui/app/docsh2.cxx @@ -157,6 +157,44 @@ SfxDocumentInfoDialog* SwDocShell::CreateDocumentInfoDialog( return pDlg; } +// Disable "multiple layout" + +void SwDocShell::ToggleBrowserMode(sal_Bool bSet, SwView* _pView ) +{ + GetDoc()->set(IDocumentSettingAccess::BROWSE_MODE, bSet ); + UpdateFontList(); + SwView* pTempView = _pView ? _pView : (SwView*)GetView(); + if( pTempView ) + { + pTempView->GetViewFrame()->GetBindings().Invalidate(FN_SHADOWCURSOR); + if( !GetDoc()->getPrinter( false ) ) + pTempView->SetPrinter( GetDoc()->getPrinter( false ), SFX_PRINTER_PRINTER | SFX_PRINTER_JOBSETUP ); + GetDoc()->CheckDefaultPageFmt(); + SfxViewFrame *pTmpFrm = SfxViewFrame::GetFirst(this, sal_False); + do { + if( pTmpFrm != pTempView->GetViewFrame() ) + { + pTmpFrm->DoClose(); + pTmpFrm = SfxViewFrame::GetFirst(this, sal_False); + } + else + pTmpFrm = pTmpFrm->GetNext(*pTmpFrm, this, sal_False); + + } while ( pTmpFrm ); + const SwViewOption& rViewOptions = *pTempView->GetWrtShell().GetViewOptions(); + pTempView->GetWrtShell().CheckBrowseView( sal_True ); + pTempView->CheckVisArea(); + if( bSet ) + { + const SvxZoomType eType = (SvxZoomType)rViewOptions.GetZoomType(); + if ( SVX_ZOOM_PERCENT != eType) + ((SwView*)GetView())->SetZoom( eType ); + } + pTempView->InvalidateBorder(); + pTempView->SetNewWindowAllowed(!bSet); + } +} +// End of disabled "multiple layout" // update text fields on document properties changes void SwDocShell::DoFlushDocInfo() @@ -655,7 +693,7 @@ void SwDocShell::Execute(SfxRequest& rReq) pDocSh = (SwDocShell*)SfxObjectShell::GetNext( *pDocSh, &aType ) ) { SwDoc* pTmp = pDocSh->GetDoc(); - if ( pTmp->GetRootFrm() ) + if ( pTmp->GetCurrentViewShell() ) //swmod 071108//swmod 071225 pTmp->InvalidateAutoCompleteFlag(); } } @@ -692,11 +730,7 @@ void SwDocShell::Execute(SfxRequest& rReq) sal_uInt16 nSlotId = 0; if( bSet && !bFound ) // Nothing found, so create new Preview - { - // Don't create new one for BrowseView! - if( !GetDoc()->get(IDocumentSettingAccess::BROWSE_MODE) ) nSlotId = SID_VIEWSHELL1; - } else if( bFound && !bSet ) nSlotId = bOnly ? SID_VIEWSHELL0 : SID_VIEWSHELL1; @@ -930,6 +964,7 @@ void SwDocShell::Execute(SfxRequest& rReq) //pSavePrinter must not be deleted again } pViewFrm->GetBindings().SetState(SfxBoolItem(SID_SOURCEVIEW, nSlot == SID_VIEWSHELL2)); + pViewFrm->GetBindings().Invalidate( SID_NEWWINDOW ); pViewFrm->GetBindings().Invalidate( SID_BROWSER_MODE ); pViewFrm->GetBindings().Invalidate( FN_PRINT_LAYOUT ); } @@ -1096,60 +1131,6 @@ void SwDocShell::Execute(SfxRequest& rReq) SW_MOD()->CheckSpellChanges(sal_False, sal_True, sal_True, sal_False ); break; - case SID_BROWSER_MODE: - case FN_PRINT_LAYOUT: // for Web, inverse to BrowserMode - { - int eState = STATE_TOGGLE; - sal_Bool bSet = sal_True; - const SfxPoolItem* pAttr=NULL; - if ( pArgs && SFX_ITEM_SET == pArgs->GetItemState( nWhich , sal_False, &pAttr )) - { - bSet = ((SfxBoolItem*)pAttr)->GetValue(); - if ( nWhich == FN_PRINT_LAYOUT ) - bSet = !bSet; - eState = bSet ? STATE_ON : STATE_OFF; - } - - if ( STATE_TOGGLE == eState ) - bSet = !GetDoc()->get(IDocumentSettingAccess::BROWSE_MODE); - - ToggleBrowserMode(bSet, 0); - - // OS: mind the numerical order! - static sal_uInt16 const aInva[] = - { - SID_NEWWINDOW,/*5620*/ - SID_BROWSER_MODE, /*6313*/ - SID_RULER_BORDERS, SID_RULER_PAGE_POS, - SID_ATTR_LONG_LRSPACE, - SID_HTML_MODE, - SID_RULER_PROTECT, - SID_AUTOSPELL_CHECK, - FN_RULER, /*20211*/ - FN_VIEW_GRAPHIC, /*20213*/ - FN_VIEW_BOUNDS, /**/ - FN_VIEW_FIELDS, /*20215*/ - FN_VLINEAL, /*20216*/ - FN_VSCROLLBAR, /*20217*/ - FN_HSCROLLBAR, /*20218*/ - FN_VIEW_META_CHARS, /**/ - FN_VIEW_MARKS, /**/ - FN_VIEW_FIELDNAME, /**/ - FN_VIEW_TABLEGRID, /*20227*/ - FN_PRINT_LAYOUT, /*20237*/ - FN_QRY_MERGE, /*20364*/ - 0 - }; - // the view must not exist! - SfxViewFrame *pTmpFrm = SfxViewFrame::GetFirst( this ); - if( pTmpFrm ) - pTmpFrm->GetBindings().Invalidate( aInva ); - if ( !pAttr ) - rReq.AppendItem( SfxBoolItem( nWhich, bSet ) ); - rReq.Done(); - } - break; - case SID_MAIL_PREPAREEXPORT: { //pWrtShell is not set in page preview @@ -1162,7 +1143,8 @@ void SwDocShell::Execute(SfxRequest& rReq) pWrtShell->EndAllAction(); } break; - case SID_MAIL_EXPORT_FINISHED: + + case SID_MAIL_EXPORT_FINISHED: { if(pWrtShell) pWrtShell->StartAllAction(); @@ -1697,73 +1679,6 @@ void SwDocShell::ReloadFromHtml( const String& rStreamName, SwSrcView* pSrcView pDoc->ResetModified(); } -void SwDocShell::ToggleBrowserMode(sal_Bool bSet, SwView* _pView ) -{ - GetDoc()->set(IDocumentSettingAccess::BROWSE_MODE, bSet ); - UpdateFontList(); - SwView* pTempView = _pView ? _pView : (SwView*)GetView(); - if( pTempView ) - { - SfxBindings& rBind = pTempView->GetViewFrame()->GetBindings(); - rBind.Invalidate(FN_SHADOWCURSOR); - rBind.Invalidate(SID_BROWSER_MODE); - rBind.Invalidate(FN_PRINT_LAYOUT); - - if( !GetDoc()->getPrinter( false ) ) - { - pTempView->SetPrinter( GetDoc()->getPrinter( false ), - SFX_PRINTER_PRINTER | SFX_PRINTER_JOBSETUP ); - } - - // #i44963# Good occasion to check if page sizes in - // page descriptions are still set to (LONG_MAX, LONG_MAX) (html import) - GetDoc()->CheckDefaultPageFmt(); - - // Currently there can be only one view (layout) if the document is viewed in Web layout - // So if there are more views we are in print layout and for toggling to Web layout all other views must be closed - SfxViewFrame *pTmpFrm = SfxViewFrame::GetFirst(this, sal_False); - do { - if( pTmpFrm != pTempView->GetViewFrame() ) - { - pTmpFrm->DoClose(); - pTmpFrm = SfxViewFrame::GetFirst(this, sal_False); - } - else - pTmpFrm = pTmpFrm->GetNext(*pTmpFrm, this, sal_False); - - } while ( pTmpFrm ); - - const SwViewOption& rViewOptions = *pTempView->GetWrtShell().GetViewOptions(); - - // set view columns before toggling: - if ( bSet ) - { - const sal_uInt16 nColumns = rViewOptions.GetViewLayoutColumns(); - const bool bBookMode = rViewOptions.IsViewLayoutBookMode(); - if ( 1 != nColumns || bBookMode ) - { - ((SwView*)GetView())->SetViewLayout( 1, false ); - } - } - - // Triggeres a formatting: - pTempView->GetWrtShell().CheckBrowseView( sal_True ); - pTempView->CheckVisArea(); - - if( GetDoc()->get(IDocumentSettingAccess::BROWSE_MODE) ) - { - const SvxZoomType eType = (SvxZoomType)rViewOptions.GetZoomType(); - - if ( SVX_ZOOM_PERCENT != eType) - { - ((SwView*)GetView())->SetZoom( eType ); - } - } - pTempView->InvalidateBorder(); - pTempView->SetNewWindowAllowed(!bSet); - } -} - sal_uLong SwDocShell::LoadStylesFromFile( const String& rURL, SwgReaderOption& rOpt, sal_Bool bUnoCall ) { diff --git a/sw/source/ui/app/docstyle.cxx b/sw/source/ui/app/docstyle.cxx index 5012f2dc45df..a27ecdecfaec 100644 --- a/sw/source/ui/app/docstyle.cxx +++ b/sw/source/ui/app/docstyle.cxx @@ -1164,14 +1164,14 @@ void SwDocStyleSheet::SetItemSet( const SfxItemSet& rSet, if( rStyle.Len() && 0 != ( pFindFmt = lcl_FindParaFmt( rDoc, rStyle, 0, sal_True ))) { - pFindFmt->Add( &aCond ); + aCond.RegisterToFormat( *pFindFmt ); ((SwConditionTxtFmtColl*)pColl)->InsertCondition( aCond ); } } // Update document to new conditions SwCondCollCondChg aMsg( pColl ); - pColl->Modify( &aMsg, &aMsg ); + pColl->ModifyNotification( &aMsg, &aMsg ); } else if( pCondItem && !pColl->GetDepends() ) { diff --git a/sw/source/ui/app/swmodul1.cxx b/sw/source/ui/app/swmodul1.cxx index aac2ba7df26e..396286caa39b 100644 --- a/sw/source/ui/app/swmodul1.cxx +++ b/sw/source/ui/app/swmodul1.cxx @@ -98,7 +98,7 @@ void lcl_SetUIPrefs(const SwViewOption* pPref, SwView* pView, ViewShell* pSh ) } if(bHScrollChanged) { - pView->ShowHScrollbar( pNewPref->IsViewHScrollBar() || pSh->getIDocumentSettingAccess()->get(IDocumentSettingAccess::BROWSE_MODE)); + pView->ShowHScrollbar( pNewPref->IsViewHScrollBar() || pNewPref->getBrowseMode() ); } //if only the position of the vertical ruler has been changed initiate an update if(bVAlignChanged && !bHScrollChanged && !bVScrollChanged) @@ -630,7 +630,7 @@ void SwModule::CheckSpellChanges( sal_Bool bOnlineSpelling, pDocSh = (SwDocShell*)SfxObjectShell::GetNext( *pDocSh, &aType ) ) { SwDoc* pTmp = pDocSh->GetDoc(); - if ( pTmp->GetRootFrm() ) + if ( pTmp->GetCurrentViewShell() ) //swmod 071108//swmod 071225 { pTmp->SpellItAgainSam( bInvalid, bOnlyWrong, bSmartTags ); ViewShell* pViewShell = 0; diff --git a/sw/source/ui/config/viewopt.cxx b/sw/source/ui/config/viewopt.cxx index fc8c87827957..646ce33b23c6 100644 --- a/sw/source/ui/config/viewopt.cxx +++ b/sw/source/ui/config/viewopt.cxx @@ -99,7 +99,8 @@ sal_Bool SwViewOption::IsEqualFlags( const SwViewOption &rOpt ) const && nPagePrevRow == rOpt.GetPagePrevRow() && nPagePrevCol == rOpt.GetPagePrevCol() && aRetoucheColor == rOpt.GetRetoucheColor() - && bFormView == rOpt.IsFormView() + && mbFormView == rOpt.IsFormView() + && mbBrowseMode == rOpt.getBrowseMode() && mbViewLayoutBookMode == rOpt.mbViewLayoutBookMode && bShowPlaceHolderFields == rOpt.bShowPlaceHolderFields && bIdle == rOpt.bIdle @@ -180,9 +181,9 @@ SwViewOption::SwViewOption() : bStarOneSetting(sal_False), bIsPagePreview(sal_False), bSelectionInReadonly(sal_False), - // #114856# Formular view - bFormView(sal_False), - bBookview(sal_False), + mbFormView(sal_False), + mbBrowseMode(sal_False), + mbBookView(sal_False), mbViewLayoutBookMode(sal_False), bShowPlaceHolderFields( sal_True ), nZoom( 100 ), @@ -222,7 +223,7 @@ SwViewOption::SwViewOption(const SwViewOption& rVOpt) bReadonly = sal_False; bSelectionInReadonly = sal_False; // #114856# Formular view - bFormView = rVOpt.bFormView; + mbFormView = rVOpt.mbFormView; nZoom = rVOpt.nZoom ; aSnapSize = rVOpt.aSnapSize ; mnViewLayoutColumns = rVOpt.mnViewLayoutColumns ; @@ -240,7 +241,8 @@ SwViewOption::SwViewOption(const SwViewOption& rVOpt) sSymbolFont = rVOpt.sSymbolFont; nShdwCrsrFillMode = rVOpt.nShdwCrsrFillMode; bStarOneSetting = rVOpt.bStarOneSetting; - bBookview = rVOpt.bBookview; + mbBookView = rVOpt.mbBookView; + mbBrowseMode = rVOpt.mbBrowseMode; mbViewLayoutBookMode = rVOpt.mbViewLayoutBookMode; bShowPlaceHolderFields = rVOpt.bShowPlaceHolderFields; bIdle = rVOpt.bIdle; @@ -262,7 +264,7 @@ SwViewOption::SwViewOption(const SwViewOption& rVOpt) SwViewOption& SwViewOption::operator=( const SwViewOption &rVOpt ) { // #114856# Formular view - bFormView = rVOpt.bFormView ; + mbFormView = rVOpt.mbFormView ; nZoom = rVOpt.nZoom ; aSnapSize = rVOpt.aSnapSize ; mnViewLayoutColumns = rVOpt.mnViewLayoutColumns ; @@ -280,7 +282,8 @@ SwViewOption& SwViewOption::operator=( const SwViewOption &rVOpt ) sSymbolFont = rVOpt.sSymbolFont; nShdwCrsrFillMode = rVOpt.nShdwCrsrFillMode; bStarOneSetting = rVOpt.bStarOneSetting; - bBookview = rVOpt.bBookview; + mbBookView = rVOpt.mbBookView; + mbBrowseMode = rVOpt.mbBrowseMode; mbViewLayoutBookMode = rVOpt.mbViewLayoutBookMode; bShowPlaceHolderFields = rVOpt.bShowPlaceHolderFields; bIdle = rVOpt.bIdle; diff --git a/sw/source/ui/dialog/SwSpellDialogChildWindow.cxx b/sw/source/ui/dialog/SwSpellDialogChildWindow.cxx index 5b5372308eb7..421798e570a3 100644 --- a/sw/source/ui/dialog/SwSpellDialogChildWindow.cxx +++ b/sw/source/ui/dialog/SwSpellDialogChildWindow.cxx @@ -103,7 +103,7 @@ struct SpellState ESelection m_aESelection; //iterating over draw text objects - std::vector<SdrTextObj*> m_aTextObjects; + std::list<SdrTextObj*> m_aTextObjects; bool m_bTextObjectsCollected; SpellState() : @@ -759,58 +759,24 @@ bool SwSpellDialogChildWindow::FindNextDrawTextError_Impl(SwWrtShell& rSh) if( pObj && pObj->ISA(SdrTextObj) ) pCurrentTextObj = static_cast<SdrTextObj*>(pObj); } - //at first fill the vector of drawing objects + //at first fill the list of drawing objects if(!m_pSpellState->m_bTextObjectsCollected ) { m_pSpellState->m_bTextObjectsCollected = true; - sal_uInt16 n = 0; - //iterate in the 'normal' array of objects - while( n < pDoc->GetSpzFrmFmts()->Count() ) + std::list<SdrTextObj*> aTextObjs; + SwDrawContact::GetTextObjectsFromFmt( aTextObjs, pDoc ); + if(pCurrentTextObj) { - SwFrmFmt* pFly = (*pDoc->GetSpzFrmFmts())[ n ]; - if( pFly->IsA( TYPE(SwDrawFrmFmt) ) ) - { - SwClientIter aIter( (SwFmt&) *pFly ); - if( aIter.First( TYPE(SwDrawContact) ) ) - { - SdrObject* pSdrO = ((SwDrawContact*)aIter())->GetMaster(); - if ( pSdrO ) - { - if ( pSdrO->IsA( TYPE(SdrObjGroup) ) ) - { - SdrObjListIter aListIter( *pSdrO, IM_DEEPNOGROUPS ); - //iterate inside of a grouped object - while( aListIter.IsMore() ) - { - SdrObject* pSdrOElement = aListIter.Next(); - if( pSdrOElement && pSdrOElement->IsA( TYPE(SdrTextObj) ) && - static_cast<SdrTextObj*>( pSdrOElement)->HasText() && - pCurrentTextObj != pSdrOElement) - { - m_pSpellState->m_aTextObjects.push_back((SdrTextObj*) pSdrOElement); + m_pSpellState->m_aTextObjects.remove(pCurrentTextObj); + m_pSpellState->m_aTextObjects.push_back(pCurrentTextObj); } } - } - else if( pSdrO->IsA( TYPE(SdrTextObj) ) && - static_cast<SdrTextObj*>( pSdrO )->HasText() && - pCurrentTextObj != pSdrO) - { - m_pSpellState->m_aTextObjects.push_back((SdrTextObj*) pSdrO); - } - } - } - } - ++n; - } - if(pCurrentTextObj) - m_pSpellState->m_aTextObjects.push_back(pCurrentTextObj); - } if(m_pSpellState->m_aTextObjects.size()) { Reference< XSpellChecker1 > xSpell( GetSpellChecker() ); while(!bNextDoc && m_pSpellState->m_aTextObjects.size()) { - std::vector<SdrTextObj*>::iterator aStart = m_pSpellState->m_aTextObjects.begin(); + std::list<SdrTextObj*>::iterator aStart = m_pSpellState->m_aTextObjects.begin(); SdrTextObj* pTextObj = *aStart; if(m_pSpellState->m_pStartDrawing == pTextObj) m_pSpellState->m_bRestartDrawing = true; diff --git a/sw/source/ui/dochdl/swdtflvr.cxx b/sw/source/ui/dochdl/swdtflvr.cxx index e10f4b61751b..7ed7cea213b3 100644 --- a/sw/source/ui/dochdl/swdtflvr.cxx +++ b/sw/source/ui/dochdl/swdtflvr.cxx @@ -117,27 +117,18 @@ #include <dochdl.hrc> #include <comcore.hrc> // #111827# #include <sot/stg.hxx> - -// #108584# #include <svx/svditer.hxx> - -// #108584# #include <editeng/eeitem.hxx> - -// #108584# #include <editeng/fhgtitem.hxx> - -// #108584# #include <svx/svdpage.hxx> #include <avmedia/mediawindow.hxx> - -// #109590# #include <swcrsr.hxx> #include <SwRewriter.hxx> #include <globals.hrc> #include <osl/mutex.hxx> #include <vcl/svapp.hxx> #include <swserv.hxx> +#include <switerator.hxx> extern sal_Bool bFrmDrag; extern sal_Bool bDDINetAttr; @@ -358,10 +349,8 @@ uno::Reference < embed::XEmbeddedObject > SwTransferable::FindOLEObj( sal_Int64& uno::Reference < embed::XEmbeddedObject > xObj; if( pClpDocFac ) { - SwClientIter aIter( *(SwModify*)pClpDocFac->GetDoc()-> - GetDfltGrfFmtColl() ); - for( SwCntntNode* pNd = (SwCntntNode*)aIter.First( TYPE( SwCntntNode ) ); - pNd; pNd = (SwCntntNode*)aIter.Next() ) + SwIterator<SwCntntNode,SwFmtColl> aIter( *pClpDocFac->GetDoc()->GetDfltGrfFmtColl() ); + for( SwCntntNode* pNd = aIter.First(); pNd; pNd = aIter.Next() ) if( ND_OLENODE == pNd->GetNodeType() ) { xObj = ((SwOLENode*)pNd)->GetOLEObj().GetOleRef(); @@ -376,10 +365,8 @@ Graphic* SwTransferable::FindOLEReplacementGraphic() const { if( pClpDocFac ) { - SwClientIter aIter( *(SwModify*)pClpDocFac->GetDoc()-> - GetDfltGrfFmtColl() ); - for( SwCntntNode* pNd = (SwCntntNode*)aIter.First( TYPE( SwCntntNode ) ); - pNd; pNd = (SwCntntNode*)aIter.Next() ) + SwIterator<SwCntntNode,SwFmtColl> aIter( *pClpDocFac->GetDoc()->GetDfltGrfFmtColl() ); + for( SwCntntNode* pNd = aIter.First(); pNd; pNd = aIter.Next() ) if( ND_OLENODE == pNd->GetNodeType() ) { return ((SwOLENode*)pNd)->GetGraphic(); diff --git a/sw/source/ui/docvw/PostItMgr.cxx b/sw/source/ui/docvw/PostItMgr.cxx index 1c014de82f5e..a369922179d9 100644 --- a/sw/source/ui/docvw/PostItMgr.cxx +++ b/sw/source/ui/docvw/PostItMgr.cxx @@ -84,6 +84,7 @@ #include <i18npool/lang.h> #include "swevent.hxx" +#include "switerator.hxx" // distance between Anchor Y and initial note position #define POSTIT_INITIAL_ANCHOR_DISTANCE 20 @@ -1099,17 +1100,16 @@ void SwPostItMgr::AddPostIts(bool bCheckExistance, bool bFocus) { bool bEmpty = mvPostItFlds.empty(); SwFieldType* pType = mpView->GetDocShell()->GetDoc()->GetFldType(RES_POSTITFLD, aEmptyStr,false); - SwClientIter aIter( *pType ); - SwClient * pFirst = aIter.GoStart(); - while(pFirst) + SwIterator<SwFmtFld,SwFieldType> aIter( *pType ); + SwFmtFld* pSwFmtFld = aIter.First(); + while(pSwFmtFld) { - SwFmtFld* pSwFmtFld = static_cast<SwFmtFld*>(pFirst); if ( pSwFmtFld->GetTxtFld()) { if ( pSwFmtFld->IsFldInDoc() ) InsertItem(pSwFmtFld,bCheckExistance,bFocus); } - pFirst = aIter++; + pSwFmtFld = aIter.Next(); } // if we just added the first one we have to update the view for centering diff --git a/sw/source/ui/docvw/edtwin.cxx b/sw/source/ui/docvw/edtwin.cxx index 2a6124aba578..818aec6e04a3 100644 --- a/sw/source/ui/docvw/edtwin.cxx +++ b/sw/source/ui/docvw/edtwin.cxx @@ -3774,7 +3774,7 @@ void SwEditWin::MouseMove(const MouseEvent& _rMEvt) if( bTstShdwCrsr && bInsWin && !bIsDocReadOnly && !bInsFrm && - !rSh.getIDocumentSettingAccess()->get(IDocumentSettingAccess::BROWSE_MODE) && + !rSh.GetViewOptions()->getBrowseMode() && rSh.GetViewOptions()->IsShadowCursor() && !(rMEvt.GetModifier() + rMEvt.GetButtons()) && !rSh.HasSelection() && !GetConnectMetaFile() ) diff --git a/sw/source/ui/fldui/fldmgr.cxx b/sw/source/ui/fldui/fldmgr.cxx index 314e12498093..ae82af0b772f 100644 --- a/sw/source/ui/fldui/fldmgr.cxx +++ b/sw/source/ui/fldui/fldmgr.cxx @@ -1028,8 +1028,8 @@ sal_Bool SwFldMgr::InsertFld( const SwInsertFld_Data& rData ) sal_uInt16 nTmpPos = sCmd.SearchAndReplace( ' ', sfx2::cTokenSeperator ); sCmd.SearchAndReplace( ' ', sfx2::cTokenSeperator, nTmpPos ); - SwDDEFieldType* pTyp = (SwDDEFieldType*)pCurShell->InsertFldType( - SwDDEFieldType( rData.sPar1, sCmd, (sal_uInt16)nFormatId )); + SwDDEFieldType aType( rData.sPar1, sCmd, (sal_uInt16) nFormatId ); + SwDDEFieldType* pTyp = (SwDDEFieldType*) pCurShell->InsertFldType( aType ); pFld = new SwDDEField( pTyp ); break; } @@ -1393,7 +1393,7 @@ sal_Bool SwFldMgr::InsertFld( const SwInsertFld_Data& rData ) else if( bPageVar ) ((SwRefPageGetFieldType*)pCurShell->GetFldType( 0, RES_REFPAGEGETFLD ))->UpdateFlds(); else if( TYP_GETREFFLD == rData.nTypeId ) - pFld->GetTyp()->Modify( 0, 0 ); + pFld->GetTyp()->ModifyNotification( 0, 0 ); // delete temporary field delete pFld; diff --git a/sw/source/ui/fldui/fldpage.cxx b/sw/source/ui/fldui/fldpage.cxx index 1f1594c0f9d7..fae0ba371ec5 100644 --- a/sw/source/ui/fldui/fldpage.cxx +++ b/sw/source/ui/fldui/fldpage.cxx @@ -54,6 +54,7 @@ #include <cmdid.h> #include <globals.hrc> #include <sfx2/bindings.hxx> +#include <switerator.hxx> using namespace ::com::sun::star; @@ -240,14 +241,13 @@ sal_Bool SwFldPage::InsertFld(sal_uInt16 nTypeId, sal_uInt16 nSubType, const Str SwDBFieldType* pTyp = (SwDBFieldType*)pSh->InsertFldType( SwDBFieldType(pSh->GetDoc(), sColumn, aData)); - SwClientIter aIter( *pOldTyp ); + SwIterator<SwFmtFld,SwFieldType> aIter( *pOldTyp ); - for( SwFmtFld* pFmtFld = (SwFmtFld*)aIter.First( TYPE(SwFmtFld) ); - pFmtFld; pFmtFld = (SwFmtFld*)aIter.Next() ) + for( SwFmtFld* pFmtFld = aIter.First(); pFmtFld; pFmtFld = aIter.Next() ) { if( pFmtFld->GetFld() == m_pCurFld) { - pTyp->Add(pFmtFld); // put field on new type + pFmtFld->RegisterToFieldType(*pTyp); pTmpFld->ChgTyp(pTyp); break; } diff --git a/sw/source/ui/frmdlg/frmpage.cxx b/sw/source/ui/frmdlg/frmpage.cxx index be483c12545e..02e1013705b0 100644 --- a/sw/source/ui/frmdlg/frmpage.cxx +++ b/sw/source/ui/frmdlg/frmpage.cxx @@ -1271,7 +1271,7 @@ void SwFrmPage::InitPos(RndStdIds eId, aAtHorzPosFT.Enable( bEnable ); aAtHorzPosED.Enable( bEnable ); - bEnable = nV == text::VertOrientation::NONE && !bFormat; + bEnable = nV == text::VertOrientation::NONE; if ( !bEnable ) { aAtVertPosED.SetValue( 0, FUNIT_TWIP ); diff --git a/sw/source/ui/inc/view.hxx b/sw/source/ui/inc/view.hxx index 56285b11d52a..080bd8bcb316 100644 --- a/sw/source/ui/inc/view.hxx +++ b/sw/source/ui/inc/view.hxx @@ -499,6 +499,7 @@ public: void SetVisArea( const Point&, sal_Bool bUpdateScrollbar = sal_True); void CheckVisArea(); + void RecheckBrowseMode(); static LAYOUT_NS Dialog* GetSearchDialog(); static sal_uInt16 GetMoveType(); diff --git a/sw/source/ui/inc/wrtsh.hxx b/sw/source/ui/inc/wrtsh.hxx index db1f651b099f..9311c2ca8e1f 100644 --- a/sw/source/ui/inc/wrtsh.hxx +++ b/sw/source/ui/inc/wrtsh.hxx @@ -454,6 +454,8 @@ typedef sal_Bool (SwWrtShell:: *FNSimpleMove)(); // die Core erzeugt eine Selektion, das SttSelect muss gerufen werden virtual void NewCoreSelection(); + virtual void ApplyViewOptions( const SwViewOption &rOpt ); + // autom. Update von Vorlagen void AutoUpdateFrame(SwFrmFmt* pFmt, const SfxItemSet& rStyleSet); void AutoUpdatePara(SwTxtFmtColl* pColl, const SfxItemSet& rStyleSet); diff --git a/sw/source/ui/index/cnttab.src b/sw/source/ui/index/cnttab.src index 9559aee6fab5..821a2c7d4505 100644..100755 --- a/sw/source/ui/index/cnttab.src +++ b/sw/source/ui/index/cnttab.src @@ -575,8 +575,8 @@ TabPage TP_TOX_ENTRY }; Window WIN_TOKEN { - Pos = MAP_APPFONT ( 70, 16 ) ; - Size = MAP_APPFONT ( 136, 12 ) ; + Pos = MAP_APPFONT ( 70, 15 ) ; + Size = MAP_APPFONT ( 136, 14 ) ; ImageButton WIN_LEFT_SCROLL { HelpID = "sw:ImageButton:TP_TOX_ENTRY:WIN_LEFT_SCROLL"; diff --git a/sw/source/ui/lingu/hhcwrp.cxx b/sw/source/ui/lingu/hhcwrp.cxx index f81cad15b7c7..715d7c2f1851 100644..100755 --- a/sw/source/ui/lingu/hhcwrp.cxx +++ b/sw/source/ui/lingu/hhcwrp.cxx @@ -543,11 +543,11 @@ void SwHHCWrapper::ReplaceUnit( if (pTargetFont && pNewUnitLanguage) { SvxFontItem aFontItem = (SvxFontItem&) aSet.Get( RES_CHRATR_CJK_FONT ); - aFontItem.GetFamilyName() = pTargetFont->GetName(); - aFontItem.GetFamily() = pTargetFont->GetFamily(); - aFontItem.GetStyleName() = pTargetFont->GetStyleName(); - aFontItem.GetPitch() = pTargetFont->GetPitch(); - aFontItem.GetCharSet() = pTargetFont->GetCharSet(); + aFontItem.SetFamilyName( pTargetFont->GetName()); + aFontItem.SetFamily( pTargetFont->GetFamily()); + aFontItem.SetStyleName( pTargetFont->GetStyleName()); + aFontItem.SetPitch( pTargetFont->GetPitch()); + aFontItem.SetCharSet( pTargetFont->GetCharSet() ); aSet.Put( aFontItem ); } diff --git a/sw/source/ui/lingu/sdrhhcwrap.cxx b/sw/source/ui/lingu/sdrhhcwrap.cxx index 2e910d09e329..8732200dbe71 100644 --- a/sw/source/ui/lingu/sdrhhcwrap.cxx +++ b/sw/source/ui/lingu/sdrhhcwrap.cxx @@ -69,7 +69,6 @@ SdrHHCWrapper::SdrHHCWrapper( SwView* pVw, pView( pVw ), pTextObj( NULL ), pOutlView( NULL ), - pListIter( NULL ), nOptions( nConvOptions ), nDocIndex( 0 ), nSourceLang( nSourceLanguage ), @@ -140,51 +139,14 @@ sal_Bool SdrHHCWrapper::ConvertNextDocument() sal_uInt16 n = nDocIndex; - while( !bNextDoc && ( pListIter || - n < pView->GetDocShell()->GetDoc()->GetSpzFrmFmts()->Count() ) ) + std::list<SdrTextObj*> aTextObjs; + SwDrawContact::GetTextObjectsFromFmt( aTextObjs, pView->GetDocShell()->GetDoc() ); + for ( std::list<SdrTextObj*>::iterator aIt = aTextObjs.begin(); aIt != aTextObjs.end(); aIt++ ) { - while( !pTextObj && pListIter ) - { - if( pListIter->IsMore() ) - { - SdrObject* pSdrO = pListIter->Next(); - if( pSdrO && pSdrO->IsA( TYPE(SdrTextObj) ) && - ( (SdrTextObj*) pSdrO )->HasText() ) - pTextObj = (SdrTextObj*) pSdrO; - } - else - { - delete pListIter; - pListIter = NULL; - } - } - - if ( !pTextObj && - n < pView->GetDocShell()->GetDoc()->GetSpzFrmFmts()->Count() ) - { - SwFrmFmt* pFly = (*pView->GetDocShell()->GetDoc()->GetSpzFrmFmts())[ n ]; - if( pFly->IsA( TYPE(SwDrawFrmFmt) ) ) - { - SwClientIter aIter( (SwFmt&) *pFly ); - if( aIter.First( TYPE(SwDrawContact) ) ) - { - SdrObject* pSdrO = ((SwDrawContact*)aIter())->GetMaster(); - if ( pSdrO ) - { - if ( pSdrO->IsA( TYPE(SdrObjGroup) ) ) - pListIter = new SdrObjListIter( *pSdrO, IM_DEEPNOGROUPS ); - else if( pSdrO->IsA( TYPE(SdrTextObj) ) && - ( (SdrTextObj*) pSdrO )->HasText() ) - pTextObj = (SdrTextObj*) pSdrO; - } - } - } - ++n; - } + pTextObj = (*aIt); if ( pTextObj ) { OutlinerParaObject* pParaObj = pTextObj->GetOutlinerParaObject(); - if ( pParaObj ) { SetPaperSize( pTextObj->GetLogicRect().GetSize() ); @@ -215,8 +177,11 @@ sal_Bool SdrHHCWrapper::ConvertNextDocument() else SetUpdateMode(sal_False); } + if ( !bNextDoc ) pTextObj = NULL; + else + break; } } diff --git a/sw/source/ui/lingu/sdrhhcwrap.hxx b/sw/source/ui/lingu/sdrhhcwrap.hxx index c9e202dcfc56..567b27b68ec9 100644 --- a/sw/source/ui/lingu/sdrhhcwrap.hxx +++ b/sw/source/ui/lingu/sdrhhcwrap.hxx @@ -44,7 +44,6 @@ class SdrHHCWrapper : public SdrOutliner SwView* pView; SdrTextObj* pTextObj; OutlinerView* pOutlView; - SdrObjListIter* pListIter; sal_Int32 nOptions; sal_uInt16 nDocIndex; LanguageType nSourceLang; diff --git a/sw/source/ui/shells/textfld.cxx b/sw/source/ui/shells/textfld.cxx index 6cce094bdb77..6ca3e8be76bf 100644 --- a/sw/source/ui/shells/textfld.cxx +++ b/sw/source/ui/shells/textfld.cxx @@ -80,6 +80,7 @@ #include <app.hrc> #include <PostItMgr.hxx> +#include <switerator.hxx> using namespace nsSwDocInfoSubType; @@ -374,17 +375,16 @@ void SwTextShell::ExecField(SfxRequest &rReq) if (pPostIt) { SwFieldType* pType = rSh.GetDoc()->GetFldType(RES_POSTITFLD, aEmptyStr,false); - SwClientIter aIter( *pType ); - SwClient* pFirst = aIter.GoStart(); - while( pFirst ) + SwIterator<SwFmtFld,SwFieldType> aIter( *pType ); + SwFmtFld* pSwFmtFld = aIter.First(); + while( pSwFmtFld ) { - SwFmtFld* pSwFmtFld = static_cast<SwFmtFld*>(pFirst); if ( pSwFmtFld->GetFld() == pPostIt ) { pSwFmtFld->Broadcast( SwFmtFldHint( 0, SWFMTFLD_FOCUS, &GetView() ) ); break; } - pFirst = aIter++; + pSwFmtFld = aIter.Next(); } } } diff --git a/sw/source/ui/shells/textsh.cxx b/sw/source/ui/shells/textsh.cxx index d7a291ceae4f..d17fd52b8e28 100644..100755 --- a/sw/source/ui/shells/textsh.cxx +++ b/sw/source/ui/shells/textsh.cxx @@ -1151,10 +1151,10 @@ void SwTextShell::InsertSymbol( SfxRequest& rReq ) if( aNewFont.GetName().Len() ) { SvxFontItem aNewFontItem( aFont ); - aNewFontItem.GetFamilyName() = aNewFont.GetName(); - aNewFontItem.GetFamily() = aNewFont.GetFamily(); - aNewFontItem.GetPitch() = aNewFont.GetPitch(); - aNewFontItem.GetCharSet() = aNewFont.GetCharSet(); + aNewFontItem.SetFamilyName( aNewFont.GetName()); + aNewFontItem.SetFamily( aNewFont.GetFamily()); + aNewFontItem.SetPitch( aNewFont.GetPitch()); + aNewFontItem.SetCharSet( aNewFont.GetCharSet() ); SfxItemSet aRestoreSet( GetPool(), RES_CHRATR_FONT, RES_CHRATR_FONT, RES_CHRATR_CJK_FONT, RES_CHRATR_CJK_FONT, diff --git a/sw/source/ui/table/tabledlg.cxx b/sw/source/ui/table/tabledlg.cxx index 2ae69c47de82..006c78003975 100644 --- a/sw/source/ui/table/tabledlg.cxx +++ b/sw/source/ui/table/tabledlg.cxx @@ -1036,12 +1036,18 @@ void SwTableColumnPage::UpdateCols( sal_uInt16 nAktPos ) if(!bModifyTable && !bProp ) { -// Tabellenbreite bleibt, Differenz wird mit der/den -// naechsten Zellen ausgeglichen +// the table width is constant, the difference is balanced with the other columns + sal_uInt16 nLoopCount = 0; while( nDiff ) { if( ++nAktPos == nNoOfVisibleCols) + { nAktPos = 0; + ++nLoopCount; + //#i101353# in small tables it might not be possible to balance column width + if( nLoopCount > 1 ) + break; + } if( nDiff < 0 ) { SetVisibleWidth(nAktPos, GetVisibleWidth(nAktPos) -nDiff); diff --git a/sw/source/ui/uiview/pview.cxx b/sw/source/ui/uiview/pview.cxx index 490b93b03f2a..790cfb62c123 100644 --- a/sw/source/ui/uiview/pview.cxx +++ b/sw/source/ui/uiview/pview.cxx @@ -1173,6 +1173,7 @@ void SwPagePreView::Init(const SwViewOption * pPrefs) aOpt.SetTable( sal_True ); aOpt.SetSnap( sal_False ); aOpt.SetGridVisible( sal_False ); + GetViewShell()->ApplyViewOptions( aOpt ); GetViewShell()->ApplyAccessiblityOptions(SW_MOD()->GetAccessibilityOptions()); @@ -1180,13 +1181,6 @@ void SwPagePreView::Init(const SwViewOption * pPrefs) SwPrintData const aPrintOptions = *SW_MOD()->GetPrtOptions(false); GetViewShell()->AdjustOptionsForPagePreview( aPrintOptions ); - IDocumentSettingAccess* pIDSA = pESh->getIDocumentSettingAccess(); - if( pIDSA->get(IDocumentSettingAccess::BROWSE_MODE)) - { - pIDSA->set(IDocumentSettingAccess::BROWSE_MODE, false); - pESh->CheckBrowseView( sal_True ); - } - GetViewShell()->CalcLayout(); DocSzChgd( GetViewShell()->GetDocSize() ); diff --git a/sw/source/ui/uiview/srcview.cxx b/sw/source/ui/uiview/srcview.cxx index abaf5aefd615..07342b1c942c 100644 --- a/sw/source/ui/uiview/srcview.cxx +++ b/sw/source/ui/uiview/srcview.cxx @@ -278,6 +278,7 @@ void SwSrcView::Init() aEditWin.SetReadonly(sal_True); } + SetNewWindowAllowed( sal_False ); StartListening(*pDocShell,sal_True); } diff --git a/sw/source/ui/uiview/view.cxx b/sw/source/ui/uiview/view.cxx index e892760914d3..a5089d532453 100644 --- a/sw/source/ui/uiview/view.cxx +++ b/sw/source/ui/uiview/view.cxx @@ -204,6 +204,13 @@ void SwView::GotFocus() const const_cast< SwView* >( this )->AttrChangedNotify( pWrtShell ); } } + if( GetWrtShellPtr() ) + { + SwWrtShell& rWrtShell = GetWrtShell(); + rWrtShell.GetDoc()->SetCurrentViewShell( GetWrtShellPtr() ); + rWrtShell.GetDoc()->set( IDocumentSettingAccess::BROWSE_MODE, + rWrtShell.GetViewOptions()->getBrowseMode() ); + } } /*-------------------------------------------------------------------- @@ -708,7 +715,6 @@ void SwView::_CheckReadonlySelection() SwView::SwView( SfxViewFrame *_pFrame, SfxViewShell* pOldSh ) : SfxViewShell( _pFrame, SWVIEWFLAGS ), - aPageStr( SW_RES( STR_PAGE )), nNewPage(USHRT_MAX), pNumRuleNodeFromDoc(0), @@ -789,9 +795,7 @@ SwView::SwView( SfxViewFrame *_pFrame, SfxViewShell* pOldSh ) //! get lingu options without loading lingu DLL SvtLinguOptions aLinguOpt; - SvtLinguConfig().GetOptions( aLinguOpt ); - aUsrPref.SetOnlineSpell( aLinguOpt.bIsSpellAuto ); sal_Bool bOldShellWasSrcView = sal_False; @@ -800,46 +804,42 @@ SwView::SwView( SfxViewFrame *_pFrame, SfxViewShell* pOldSh ) // document SfxViewShell* pExistingSh = 0; if ( pOldSh ) - pExistingSh = pOldSh; - else - { - SfxViewFrame *pF = SfxViewFrame::GetFirst( pDocSh ); - if( pF == _pFrame ) - pF = SfxViewFrame::GetNext( *pF, pDocSh ); - if( pF ) - pExistingSh = pF->GetViewShell(); - } - - // determine type of existing view - if( pExistingSh && - pExistingSh->IsA( TYPE( SwPagePreView ) ) ) { - sSwViewData = ((SwPagePreView*)pExistingSh)->GetPrevSwViewData(); - sNewCrsrPos = ((SwPagePreView*)pExistingSh)->GetNewCrsrPos(); - nNewPage = ((SwPagePreView*)pExistingSh)->GetNewPage(); - bOldShellWasPagePreView = sal_True; + pExistingSh = pOldSh; + // determine type of existing view + if( pExistingSh->IsA( TYPE( SwPagePreView ) ) ) + { + sSwViewData = ((SwPagePreView*)pExistingSh)->GetPrevSwViewData(); + sNewCrsrPos = ((SwPagePreView*)pExistingSh)->GetNewCrsrPos(); + nNewPage = ((SwPagePreView*)pExistingSh)->GetNewPage(); + bOldShellWasPagePreView = sal_True; + } + else if( pExistingSh->IsA( TYPE( SwSrcView ) ) ) + bOldShellWasSrcView = sal_True; } - else if( pExistingSh && - pExistingSh->IsA( TYPE( SwSrcView ) ) ) - bOldShellWasSrcView = sal_True; RTL_LOGFILE_CONTEXT_TRACE( aLog, "before create WrtShell" ); if(PTR_CAST( SwView, pExistingSh)) { pWrtShell = new SwWrtShell( *((SwView*)pExistingSh)->pWrtShell, pEditWin, *this); -//MA: Das kann doch nur zu einem GPF fuehren! -// nSelectionType = ((SwView*)pOldSh)->nSelectionType; + } + else if( dynamic_cast<SwWrtShell*>( pDocSh->GetDoc()->GetCurrentViewShell() ) ) + { + pWrtShell = new SwWrtShell( *(SwWrtShell*)pDocSh->GetDoc()->GetCurrentViewShell(), + pEditWin, *this); } else { SwDoc& rDoc = *((SwDocShell*)pDocSh)->GetDoc(); if( !bOldShellWasSrcView && pWebDShell && !bOldShellWasPagePreView ) - rDoc.set(IDocumentSettingAccess::BROWSE_MODE, true); + aUsrPref.setBrowseMode( sal_True ); + else if( rDoc.IsLoaded() ) + aUsrPref.setBrowseMode( rDoc.get(IDocumentSettingAccess::BROWSE_MODE) ); //Fuer den BrowseMode wollen wir keinen Factor uebernehmen. - if( rDoc.get(IDocumentSettingAccess::BROWSE_MODE) && aUsrPref.GetZoomType() != SVX_ZOOM_PERCENT ) + if( aUsrPref.getBrowseMode() && aUsrPref.GetZoomType() != SVX_ZOOM_PERCENT ) { aUsrPref.SetZoomType( SVX_ZOOM_PERCENT ); aUsrPref.SetZoom( 100 ); @@ -947,8 +947,10 @@ SwView::SwView( SfxViewFrame *_pFrame, SfxViewShell* pOldSh ) pWrtShell->DoUndo( 0 != SW_MOD()->GetUndoOptions().GetUndoCount() ); - const sal_Bool bBrowse = pWrtShell->getIDocumentSettingAccess()->get(IDocumentSettingAccess::BROWSE_MODE); + const sal_Bool bBrowse = pWrtShell->GetViewOptions()->getBrowseMode(); + // Disable "multiple window" SetNewWindowAllowed(!bBrowse); + // End of disabled multiple window ShowVScrollbar(aUsrPref.IsViewVScrollBar()); ShowHScrollbar(aUsrPref.IsViewHScrollBar()); @@ -1085,9 +1087,6 @@ SwView::~SwView() delete pFormatClipboard; } -/*-------------------------------------------------------------------- - Beschreibung: DocShell rausgrabbeln ueber das FrameWindow - --------------------------------------------------------------------*/ SwDocShell* SwView::GetDocShell() { SfxObjectShell* pDocShell = GetViewFrame()->GetObjectShell(); @@ -1148,7 +1147,7 @@ void SwView::ReadUserData( const String &rUserData, sal_Bool bBrowse ) if ( rUserData.GetTokenCount() > 1 && //Fuer Dokumente ohne Layout nur im OnlineLayout oder beim //Forward/Backward - (!pWrtShell->IsNewLayout() || pWrtShell->getIDocumentSettingAccess()->get(IDocumentSettingAccess::BROWSE_MODE) || bBrowse) ) + (!pWrtShell->IsNewLayout() || pWrtShell->GetViewOptions()->getBrowseMode() || bBrowse) ) { bool bIsOwnDocument = lcl_IsOwnDocument( *this ); @@ -1170,7 +1169,7 @@ void SwView::ReadUserData( const String &rUserData, sal_Bool bBrowse ) nRight = rUserData.GetToken(0, ';', nPos ).ToInt32(), nBottom= rUserData.GetToken(0, ';', nPos ).ToInt32(); - const long nAdd = pWrtShell->getIDocumentSettingAccess()->get(IDocumentSettingAccess::BROWSE_MODE) ? DOCUMENTBORDER : DOCUMENTBORDER*2; + const long nAdd = pWrtShell->GetViewOptions()->getBrowseMode() ? DOCUMENTBORDER : DOCUMENTBORDER*2; if ( nBottom <= (pWrtShell->GetDocSize().Height()+nAdd) ) { pWrtShell->EnableSmooth( sal_False ); @@ -1179,7 +1178,7 @@ void SwView::ReadUserData( const String &rUserData, sal_Bool bBrowse ) sal_uInt16 nOff = 0; SvxZoomType eZoom; - if( !pWrtShell->getIDocumentSettingAccess()->get(IDocumentSettingAccess::BROWSE_MODE) ) + if( !pWrtShell->GetViewOptions()->getBrowseMode() ) eZoom = (SvxZoomType) (sal_uInt16)rUserData.GetToken(nOff, ';', nPos ).ToInt32(); else { @@ -1267,7 +1266,7 @@ void SwView::ReadUserDataSequence ( const uno::Sequence < beans::PropertyValue > return; bool bIsOwnDocument = lcl_IsOwnDocument( *this ); sal_Int32 nLength = rSequence.getLength(); - if (nLength && (!pWrtShell->IsNewLayout() || pWrtShell->getIDocumentSettingAccess()->get(IDocumentSettingAccess::BROWSE_MODE) || bBrowse) ) + if (nLength && (!pWrtShell->IsNewLayout() || pWrtShell->GetViewOptions()->getBrowseMode() || bBrowse) ) { SET_CURR_SHELL(pWrtShell); const beans::PropertyValue *pValue = rSequence.getConstArray(); @@ -1355,7 +1354,7 @@ void SwView::ReadUserDataSequence ( const uno::Sequence < beans::PropertyValue > if (bGotVisibleBottom) { Point aCrsrPos( nX, nY ); - const long nAdd = pWrtShell->getIDocumentSettingAccess()->get(IDocumentSettingAccess::BROWSE_MODE) ? DOCUMENTBORDER : DOCUMENTBORDER*2; + const long nAdd = pWrtShell->GetViewOptions()->getBrowseMode() ? DOCUMENTBORDER : DOCUMENTBORDER*2; if (nBottom <= (pWrtShell->GetDocSize().Height()+nAdd) ) { pWrtShell->EnableSmooth( sal_False ); @@ -1363,7 +1362,7 @@ void SwView::ReadUserDataSequence ( const uno::Sequence < beans::PropertyValue > sal_uInt16 nOff = 0; SvxZoomType eZoom; - if ( !pWrtShell->getIDocumentSettingAccess()->get(IDocumentSettingAccess::BROWSE_MODE) ) + if ( !pWrtShell->GetViewOptions()->getBrowseMode() ) eZoom = static_cast < SvxZoomType > ( nZoomType ); else { diff --git a/sw/source/ui/uiview/view0.cxx b/sw/source/ui/uiview/view0.cxx index 84746fd6510e..9b55a8247ebd 100644 --- a/sw/source/ui/uiview/view0.cxx +++ b/sw/source/ui/uiview/view0.cxx @@ -48,15 +48,17 @@ #include <sfx2/bindings.hxx> #include <uivwimp.hxx> #include <avmedia/mediaplayer.hxx> +//#include <swlinguconfig.hxx> #include <swmodule.hxx> #include <sfx2/objface.hxx> #include <navipi.hxx> #include <wrtsh.hxx> -#include "doc.hxx" +#include <edtwin.hxx> #include "view.hxx" #include "basesh.hxx" #include "docsh.hxx" +#include "doc.hxx" #include "globals.hrc" #include "cmdid.h" // FN_ ... #include "globdoc.hxx" @@ -198,6 +200,46 @@ void lcl_SetViewMetaChars( SwViewOption& rVOpt, sal_Bool bOn) } } +void SwView::RecheckBrowseMode() +{ + // OS: numerische Reihenfolge beachten! + static sal_uInt16 const aInva[] = + { + //SID_NEWWINDOW,/*5620*/ + SID_BROWSER_MODE, /*6313*/ + SID_RULER_BORDERS, SID_RULER_PAGE_POS, + //SID_ATTR_LONG_LRSPACE, + SID_HTML_MODE, + SID_RULER_PROTECT, + //SID_AUTOSPELL_CHECK, + //SID_AUTOSPELL_MARKOFF, + FN_RULER, /*20211*/ + FN_VIEW_GRAPHIC, /*20213*/ + FN_VIEW_BOUNDS, /**/ + FN_VIEW_FIELDS, /*20215*/ + FN_VLINEAL, /*20216*/ + FN_VSCROLLBAR, /*20217*/ + FN_HSCROLLBAR, /*20218*/ + FN_VIEW_META_CHARS, /**/ + FN_VIEW_MARKS, /**/ + //FN_VIEW_FIELDNAME, /**/ + FN_VIEW_TABLEGRID, /*20227*/ + FN_PRINT_LAYOUT, /*20237*/ + FN_QRY_MERGE, /*20364*/ + FN_SHADOWCURSOR, /**/ + 0 + }; + // the view must not exist! + GetViewFrame()->GetBindings().Invalidate(aInva); + CheckVisArea(); + + SvxZoomType eType; + if( GetWrtShell().GetViewOptions()->getBrowseMode() && SVX_ZOOM_PERCENT != (eType = (SvxZoomType) + GetWrtShell().GetViewOptions()->GetZoomType()) ) + SetZoom( eType ); + InvalidateBorder(); +} + /*-------------------------------------------------------------------- State of view options --------------------------------------------------------------------*/ @@ -212,7 +254,6 @@ void SwView::StateViewOptions(SfxItemSet &rSet) while(nWhich) { sal_Bool bReadonly = GetDocShell()->IsReadOnly(); - sal_Bool bBrowse = pIDSA ? pIDSA->get( IDocumentSettingAccess::BROWSE_MODE ) : sal_False; if ( bReadonly && nWhich != FN_VIEW_GRAPHIC ) { rSet.DisableItem(nWhich); @@ -231,6 +272,15 @@ void SwView::StateViewOptions(SfxItemSet &rSet) aBool.SetValue( pOpt->IsViewAnyRuler()); } break; + case SID_BROWSER_MODE: + case FN_PRINT_LAYOUT: + { + sal_Bool bState = pOpt->getBrowseMode(); + if(FN_PRINT_LAYOUT == nWhich) + bState = !bState; + aBool.SetValue( bState ); + } + break; case FN_VIEW_BOUNDS: aBool.SetValue( SwViewOption::IsDocBoundaries()); break; case FN_VIEW_GRAPHIC: @@ -270,7 +320,7 @@ void SwView::StateViewOptions(SfxItemSet &rSet) case FN_VLINEAL: aBool.SetValue( 0 != StatVLineal() ); break; case FN_HSCROLLBAR: - if(bBrowse) + if( pOpt->getBrowseMode() ) { rSet.DisableItem(nWhich); nWhich = 0; @@ -283,7 +333,7 @@ void SwView::StateViewOptions(SfxItemSet &rSet) aBool.SetValue( pOpt->IsOnlineSpell() ); break; case FN_SHADOWCURSOR: - if (pIDSA == 0 || pIDSA->get( IDocumentSettingAccess::BROWSE_MODE )) + if (pIDSA == 0 || pOpt->getBrowseMode() ) { rSet.DisableItem( nWhich ); nWhich = 0; @@ -313,6 +363,7 @@ void SwView::ExecViewOptions(SfxRequest &rReq) int eState = STATE_TOGGLE; sal_Bool bSet = sal_False; + bool bBrowseModeChanged = false; const SfxItemSet *pArgs = rReq.GetArgs(); sal_uInt16 nSlot = rReq.GetSlot(); @@ -369,6 +420,19 @@ void SwView::ExecViewOptions(SfxRequest &rReq) pOpt->SetCrossHair( bFlag ); break; + case SID_BROWSER_MODE: + case FN_PRINT_LAYOUT: + if( STATE_TOGGLE == eState ) + bFlag = !pOpt->getBrowseMode(); + else if( nSlot == FN_PRINT_LAYOUT ) + bFlag = !bFlag; + bBrowseModeChanged = bFlag != pOpt->getBrowseMode(); + // Disable "multiple layout" + GetDocShell()->ToggleBrowserMode( bFlag, this ); + + pOpt->setBrowseMode( bFlag ); + break; + case FN_VIEW_NOTES: if ( STATE_TOGGLE == eState ) bFlag = !pOpt->IsPostIts(); @@ -497,6 +561,11 @@ void SwView::ExecViewOptions(SfxRequest &rReq) if( !(*rSh.GetViewOptions() == *pOpt )) { rSh.ApplyViewOptions( *pOpt ); + if( bBrowseModeChanged ) + { + RecheckBrowseMode(); + CheckVisArea(); + } //Die UsrPref muessen als Modified gekennzeichnet werden. //call for initialization @@ -517,6 +586,8 @@ void SwView::ExecViewOptions(SfxRequest &rReq) const sal_Bool bLockedView = rSh.IsViewLocked(); rSh.LockView( sal_True ); //lock visible section GetWrtShell().EndAction(); + if( bBrowseModeChanged && !bFlag ) + CalcVisArea( GetEditWin().GetOutputSizePixel() ); rSh.LockView( bLockedView ); delete pOpt; diff --git a/sw/source/ui/uiview/view2.cxx b/sw/source/ui/uiview/view2.cxx index 400d878df6af..358233107f5f 100644 --- a/sw/source/ui/uiview/view2.cxx +++ b/sw/source/ui/uiview/view2.cxx @@ -1216,8 +1216,9 @@ void SwView::StateStatusLine(SfxItemSet &rSet) { const SwViewOption* pVOpt = rShell.GetViewOptions(); SvxZoomType eZoom = (SvxZoomType) pVOpt->GetZoomType(); - SvxZoomItem aZoom(eZoom, pVOpt->GetZoom()); - if(pWrtShell->getIDocumentSettingAccess()->get(IDocumentSettingAccess::BROWSE_MODE)) + SvxZoomItem aZoom(eZoom, + pVOpt->GetZoom()); + if( pVOpt->getBrowseMode() ) { aZoom.SetValueSet( SVX_ZOOM_ENABLE_50| @@ -1516,7 +1517,7 @@ void SwView::ExecuteStatusLine(SfxRequest &rReq) SfxItemSet aCoreSet(pShell->GetPool(), SID_ATTR_ZOOM, SID_ATTR_ZOOM, SID_ATTR_VIEWLAYOUT, SID_ATTR_VIEWLAYOUT, 0 ); SvxZoomItem aZoom( (SvxZoomType)rViewOptions.GetZoomType(), rViewOptions.GetZoom() ); - const bool bBrowseMode = rSh.getIDocumentSettingAccess()->get(IDocumentSettingAccess::BROWSE_MODE); + const bool bBrowseMode = rSh.GetViewOptions()->getBrowseMode(); if( bBrowseMode ) { aZoom.SetValueSet( diff --git a/sw/source/ui/uiview/viewport.cxx b/sw/source/ui/uiview/viewport.cxx index edbb2ef5f4dc..656fe9121487 100644 --- a/sw/source/ui/uiview/viewport.cxx +++ b/sw/source/ui/uiview/viewport.cxx @@ -67,7 +67,7 @@ static sal_uInt16 nPgNum = 0; sal_Bool SwView::IsDocumentBorder() { return GetDocShell()->GetCreateMode() == SFX_CREATE_MODE_EMBEDDED || - pWrtShell->getIDocumentSettingAccess()->get(IDocumentSettingAccess::BROWSE_MODE) || + pWrtShell->GetViewOptions()->getBrowseMode() || SVX_ZOOM_PAGEWIDTH_NOBORDER == (SvxZoomType)pWrtShell->GetViewOptions()->GetZoomType(); } @@ -181,7 +181,7 @@ aDocSz = rSz; //Wenn Text geloescht worden ist, kann es sein, dass die VisArea hinter //den sichtbaren Bereich verweist Rectangle aNewVisArea( aVisArea ); - sal_Bool bModified = false; + bool bModified = false; SwTwips lGreenOffset = IsDocumentBorder() ? DOCUMENTBORDER : DOCUMENTBORDER * 2; SwTwips lTmp = aDocSz.Width() + lGreenOffset; @@ -190,7 +190,7 @@ aDocSz = rSz; lTmp = aNewVisArea.Right() - lTmp; aNewVisArea.Right() -= lTmp; aNewVisArea.Left() -= lTmp; - bModified = sal_True; + bModified = true; } lTmp = aDocSz.Height() + lGreenOffset; @@ -199,7 +199,7 @@ aDocSz = rSz; lTmp = aNewVisArea.Bottom() - lTmp; aNewVisArea.Bottom() -= lTmp; aNewVisArea.Top() -= lTmp; - bModified = sal_True; + bModified = true; } if ( bModified ) @@ -336,7 +336,7 @@ void SwView::SetVisArea( const Point &rPt, sal_Bool bUpdateScrollbar ) void SwView::CheckVisArea() { - pHScrollbar->SetAuto( pWrtShell->getIDocumentSettingAccess()->get(IDocumentSettingAccess::BROWSE_MODE) && + pHScrollbar->SetAuto( pWrtShell->GetViewOptions()->getBrowseMode() && !GetViewFrame()->GetFrame().IsInPlace() ); if ( IsDocumentBorder() ) { @@ -683,7 +683,7 @@ IMPL_LINK( SwView, ScrollHdl, SwScrollbar *, pScrollbar ) if ( pScrollbar->GetType() == SCROLL_DRAG ) pWrtShell->EnableSmooth( sal_False ); - if(!pWrtShell->getIDocumentSettingAccess()->get(IDocumentSettingAccess::BROWSE_MODE) && + if(!pWrtShell->GetViewOptions()->getBrowseMode() && pScrollbar->GetType() == SCROLL_DRAG) { //Hier wieder auskommentieren wenn das mitscrollen nicht gewuenscht ist. @@ -842,7 +842,7 @@ void SwView::CalcAndSetBorderPixel( SvBorder &rToFill, sal_Bool /*bInner*/ ) } //#i32913# in browse mode the visibility of the horizontal scrollbar // depends on the content (fixed width tables may require a scrollbar) - if ( pHScrollbar->IsVisible(pWrtShell->getIDocumentSettingAccess()->get(IDocumentSettingAccess::BROWSE_MODE)) ) + if ( pHScrollbar->IsVisible(pWrtShell->GetViewOptions()->getBrowseMode()) ) rToFill.Bottom() = nTmp; SetBorderPixel( rToFill ); @@ -1078,7 +1078,7 @@ void SwView::OuterResizePixel( const Point &rOfst, const Size &rSize ) bInOuterResizePixel = sal_True; // feststellen, ob Scrollbars angezeigt werden duerfen - sal_Bool bBrowse = pWrtShell->getIDocumentSettingAccess()->get(IDocumentSettingAccess::BROWSE_MODE); + sal_Bool bBrowse = pWrtShell->GetViewOptions()->getBrowseMode(); sal_Bool bShowH = sal_False, bShowV = sal_False, bAuto = sal_False, @@ -1172,7 +1172,7 @@ void SwView::OuterResizePixel( const Point &rOfst, const Size &rSize ) pDocSh->SetVisArea( pDocSh->SfxInPlaceObject::GetVisArea() );*/ if ( pWrtShell->GetViewOptions()->GetZoomType() != SVX_ZOOM_PERCENT && - !pWrtShell->getIDocumentSettingAccess()->get(IDocumentSettingAccess::BROWSE_MODE) ) + !pWrtShell->GetViewOptions()->getBrowseMode() ) _SetZoom( aEditSz, (SvxZoomType)pWrtShell->GetViewOptions()->GetZoomType(), 100, sal_True ); pWrtShell->EndAction(); @@ -1230,7 +1230,7 @@ void SwView::SetZoomFactor( const Fraction &rX, const Fraction &rY ) Size SwView::GetOptimalSizePixel() const { Size aPgSize; - if ( pWrtShell->getIDocumentSettingAccess()->get(IDocumentSettingAccess::BROWSE_MODE) ) + if ( pWrtShell->GetViewOptions()->getBrowseMode() ) aPgSize = SvxPaperInfo::GetPaperSize(PAPER_A4); else { diff --git a/sw/source/ui/uiview/viewtab.cxx b/sw/source/ui/uiview/viewtab.cxx index 2636015dc9c1..a99fa09c968d 100644 --- a/sw/source/ui/uiview/viewtab.cxx +++ b/sw/source/ui/uiview/viewtab.cxx @@ -260,9 +260,8 @@ void SwView::ExecTabWin( SfxRequest& rReq ) const sal_uInt16 nFrmType = rSh.IsObjSelected() ? FRMTYPE_DRAWOBJ : rSh.GetFrmType(0,sal_True); - const sal_Bool bFrmSelection = rSh.IsFrmSelected(); - const sal_Bool bBrowse = rSh.getIDocumentSettingAccess()->get(IDocumentSettingAccess::BROWSE_MODE); - + const sal_Bool bFrmSelection = rSh.IsFrmSelected(); + const sal_Bool bBrowse = rSh.GetViewOptions()->getBrowseMode(); const sal_uInt16 nSlot = rReq.GetSlot(); const sal_uInt16 nDescId = rSh.GetCurPageDesc(); @@ -882,8 +881,7 @@ void SwView::StateTabWin(SfxItemSet& rSet) : rSh.GetFrmType( pPt, sal_True ); const sal_Bool bFrmSelection = rSh.IsFrmSelected(); - - const sal_Bool bBrowse = rSh.getIDocumentSettingAccess()->get(IDocumentSettingAccess::BROWSE_MODE); + const sal_Bool bBrowse = rSh.GetViewOptions()->getBrowseMode(); // PageOffset/Begrenzer const SwRect& rPageRect = rSh.GetAnyCurRect( RECT_PAGE, pPt ); const SwRect& rPagePrtRect = rSh.GetAnyCurRect( RECT_PAGE_PRT, pPt ); diff --git a/sw/source/ui/uno/unomod.cxx b/sw/source/ui/uno/unomod.cxx index af6a9ebe0013..6e967708db28 100644 --- a/sw/source/ui/uno/unomod.cxx +++ b/sw/source/ui/uno/unomod.cxx @@ -742,8 +742,13 @@ void SwXViewSettings::_setSingleValue( const comphelper::PropertyInfo & rInfo, c break; case HANDLE_VIEWSET_ONLINE_LAYOUT : { - if( pView && !bVal != !pView->GetWrtShell().getIDocumentSettingAccess()->get(IDocumentSettingAccess::BROWSE_MODE) ) - pView->GetDocShell()->ToggleBrowserMode(bVal, pView ); + if( pView && !bVal != !pView->GetWrtShell().GetViewOptions()->getBrowseMode() ) + { + SwViewOption aOpt( *pView->GetWrtShell().GetViewOptions() ); + aOpt.setBrowseMode( bVal ); + pView->GetWrtShell().ApplyViewOptions( aOpt ); + pView->RecheckBrowseMode(); + } } break; case HANDLE_VIEWSET_HELP_URL : @@ -930,7 +935,7 @@ void SwXViewSettings::_getSingleValue( const comphelper::PropertyInfo & rInfo, u break; case HANDLE_VIEWSET_ONLINE_LAYOUT: if(pView) - bBoolVal = pView->GetWrtShell().getIDocumentSettingAccess()->get(IDocumentSettingAccess::BROWSE_MODE); + bBoolVal = pView->GetWrtShell().GetViewOptions()->getBrowseMode(); break; case HANDLE_VIEWSET_HELP_URL : { diff --git a/sw/source/ui/uno/unotxdoc.cxx b/sw/source/ui/uno/unotxdoc.cxx index 6a81a4119d0b..d1f8c5eba6cb 100644..100755 --- a/sw/source/ui/uno/unotxdoc.cxx +++ b/sw/source/ui/uno/unotxdoc.cxx @@ -2209,10 +2209,10 @@ void SwXTextDocument::refresh(void) throw( RuntimeException ) SolarMutexGuard aGuard; if(!IsValid()) throw RuntimeException(); - SwWrtShell *pWrtShell = pDocShell->GetWrtShell(); + ViewShell *pViewShell = pDocShell->GetWrtShell(); notifyRefreshListeners(); - if(pWrtShell) - pWrtShell->CalcLayout(); + if(pViewShell) + pViewShell->CalcLayout(); } void SwXTextDocument::addRefreshListener(const Reference< util::XRefreshListener > & l) @@ -2502,42 +2502,59 @@ sal_Int32 SAL_CALL SwXTextDocument::getRendererCount( else { SwDocShell *pRenderDocShell = pDoc->GetDocShell(); - SwWrtShell *pWrtShell = pRenderDocShell->GetWrtShell(); - if (bFormat) + + // TODO/mba: we really need a generic way to get the ViewShell! + ViewShell* pViewShell = 0; + SwView* pSwView = PTR_CAST(SwView, pView); + if ( pSwView ) { - // #i38289 - if(pDoc->get(IDocumentSettingAccess::BROWSE_MODE)) + pViewShell = pSwView->GetWrtShellPtr(); + } + else + { + if ( bIsPDFExport && bFormat ) { - pRenderDocShell->ToggleBrowserMode(false,NULL); + //create a hidden view to be able to export as PDF also in print preview + //pView and pSwView are not changed intentionally! + m_pHiddenViewFrame = SfxViewFrame::LoadHiddenDocument( *pRenderDocShell, 2 ); + pViewShell = ((SwView*)m_pHiddenViewFrame->GetViewShell())->GetWrtShellPtr(); } + else + pViewShell = ((SwPagePreView*)pView)->GetViewShell(); + } + + if (!pViewShell || !pViewShell->GetLayout()) + return 0; - if (!pWrtShell) + if (bFormat) + { + // #i38289 + if( pViewShell->GetViewOptions()->getBrowseMode() ) { - //create a hidden view to be able to export as PDF also in print preview - m_pHiddenViewFrame = SfxViewFrame::LoadHiddenDocument( *pRenderDocShell, 2 ); - SwView* pSwView = (SwView*) m_pHiddenViewFrame->GetViewShell(); - pWrtShell = pSwView->GetWrtShellPtr(); + SwViewOption aOpt( *pViewShell->GetViewOptions() ); + aOpt.setBrowseMode( false ); + pViewShell->ApplyViewOptions( aOpt ); + pSwView->RecheckBrowseMode(); } // reformating the document for printing will show the changes in the view // which is likely to produce many unwanted and not nice to view actions. // We don't want that! Thus we disable updating of the view. - pWrtShell->StartAction(); + pViewShell->StartAction(); - const TypeId aSwViewTypeId = TYPE(SwView); - if (pView->IsA(aSwViewTypeId)) + if (pSwView) { - if (m_pRenderData && m_pRenderData->NeedNewViewOptionAdjust( *pWrtShell ) ) + if (m_pRenderData && m_pRenderData->NeedNewViewOptionAdjust( *pViewShell ) ) m_pRenderData->ViewOptionAdjustStop(); if (m_pRenderData && !m_pRenderData->IsViewOptionAdjust()) - m_pRenderData->ViewOptionAdjustStart( *pWrtShell, *pWrtShell->GetViewOptions() ); + m_pRenderData->ViewOptionAdjustStart( *pViewShell, *pViewShell->GetViewOptions() ); } m_pRenderData->SetSwPrtOptions( new SwPrintData ); m_pRenderData->MakeSwPrtOptions( m_pRenderData->GetSwPrtOptionsRef(), pRenderDocShell, m_pPrintUIOptions, m_pRenderData, bIsPDFExport ); - if (pView->IsA(aSwViewTypeId)) + if (pSwView) { // PDF export should not make use of the SwPrtOptions const SwPrintData *pPrtOptions = (bIsPDFExport) @@ -2547,7 +2564,7 @@ sal_Int32 SAL_CALL SwXTextDocument::getRendererCount( // since printing now also use the API for PDF export this option // should be set for printing as well ... - pWrtShell->SetPDFExportOption( sal_True ); + pViewShell->SetPDFExportOption( sal_True ); bool bOrigStatus = pRenderDocShell->IsEnableSetModified(); // check configuration: shall update of printing information in DocInfo set the document to "modified"? bool bStateChanged = false; @@ -2557,9 +2574,8 @@ sal_Int32 SAL_CALL SwXTextDocument::getRendererCount( bStateChanged = true; } - // --> FME 2005-05-23 #122919# Force field update before PDF export: - pWrtShell->ViewShell::UpdateFlds(sal_True); + pViewShell->ViewShell::UpdateFlds(sal_True); // <-- if( bStateChanged ) pRenderDocShell->EnableSetModified( sal_True ); @@ -2567,17 +2583,16 @@ sal_Int32 SAL_CALL SwXTextDocument::getRendererCount( // there is some redundancy between those two function calls, but right now // there is no time to sort this out. //TODO: check what exatly needs to be done and make just one function for that - pWrtShell->CalcLayout(); - pWrtShell->CalcPagesForPrint( pDoc->GetPageCount() ); - - pWrtShell->SetPDFExportOption( sal_False ); + pViewShell->CalcLayout(); + pViewShell->CalcPagesForPrint( pViewShell->GetPageCount() ); + pViewShell->SetPDFExportOption( sal_False ); // enable view again - pWrtShell->EndAction(); + pViewShell->EndAction(); } - const sal_Int32 nPageCount = pDoc->GetPageCount(); + const sal_Int32 nPageCount = pViewShell->GetPageCount(); // // get number of pages to be rendered @@ -2585,7 +2600,7 @@ sal_Int32 SAL_CALL SwXTextDocument::getRendererCount( const bool bPrintProspect = m_pPrintUIOptions->getBoolValue( "PrintProspect", false ); if (bPrintProspect) { - pDoc->CalculatePagePairsForProspectPrinting( *m_pRenderData, *m_pPrintUIOptions, nPageCount ); + pDoc->CalculatePagePairsForProspectPrinting( *pViewShell->GetLayout(), *m_pRenderData, *m_pPrintUIOptions, nPageCount ); nRet = m_pRenderData->GetPagePairsForProspectPrinting().size(); } else @@ -2594,12 +2609,12 @@ sal_Int32 SAL_CALL SwXTextDocument::getRendererCount( if (nPostItMode != POSTITS_NONE) { OutputDevice *pOutDev = lcl_GetOutputDevice( *m_pPrintUIOptions ); - m_pRenderData->CreatePostItData( pDoc, pWrtShell->GetViewOptions(), pOutDev ); + m_pRenderData->CreatePostItData( pDoc, pViewShell->GetViewOptions(), pOutDev ); } // get set of valid document pages (according to the current settings) // and their start frames - pDoc->CalculatePagesForPrinting( *m_pRenderData, *m_pPrintUIOptions, bIsPDFExport, nPageCount ); + pDoc->CalculatePagesForPrinting( *pViewShell->GetLayout(), *m_pRenderData, *m_pPrintUIOptions, bIsPDFExport, nPageCount ); if (nPostItMode != POSTITS_NONE) { @@ -2653,6 +2668,15 @@ uno::Sequence< beans::PropertyValue > SAL_CALL SwXTextDocument::getRenderer( // Thus instead of throwing the exception we silently return. if (0 > nRenderer) throw IllegalArgumentException(); + + // TODO/mba: we really need a generic way to get the ViewShell! + ViewShell* pVwSh = 0; + SwView* pSwView = PTR_CAST(SwView, pView); + if ( pSwView ) + pVwSh = pSwView->GetWrtShellPtr(); + else + pVwSh = ((SwPagePreView*)pView)->GetViewShell(); + sal_Int32 nMaxRenderer = 0; if (!bIsSwSrcView && m_pRenderData) { @@ -2721,7 +2745,7 @@ uno::Sequence< beans::PropertyValue > SAL_CALL SwXTextDocument::getRenderer( // we just state what output size we would need // which may cause vcl to set that page size on the printer // (if available and not overriden by the user) - aTmpSize = pDoc->GetPageSize( nPage, bIsSkipEmptyPages ); + aTmpSize = pVwSh->GetPageSize( nPage, bIsSkipEmptyPages ); aPreferredPageSize = awt::Size ( TWIP_TO_MM100( 2 * aTmpSize.Width() ), TWIP_TO_MM100( aTmpSize.Height() )); } @@ -2743,7 +2767,7 @@ uno::Sequence< beans::PropertyValue > SAL_CALL SwXTextDocument::getRenderer( } else { - aTmpSize = pDoc->GetPageSize( nPage, bIsSkipEmptyPages ); + aTmpSize = pVwSh->GetPageSize( nPage, bIsSkipEmptyPages ); aPageSize = awt::Size ( TWIP_TO_MM100( aTmpSize.Width() ), TWIP_TO_MM100( aTmpSize.Height() )); } @@ -2876,9 +2900,12 @@ void SAL_CALL SwXTextDocument::render( ViewShell* pVwSh = 0; if (pView) { - pVwSh = pView->IsA(aSwViewTypeId) ? - ((SwView*)pView)->GetWrtShellPtr() : - ((SwPagePreView*)pView)->GetViewShell(); + // TODO/mba: we really need a generic way to get the ViewShell! + SwView* pSwView = PTR_CAST(SwView, pView); + if ( pSwView ) + pVwSh = pSwView->GetWrtShellPtr(); + else + pVwSh = ((SwPagePreView*)pView)->GetViewShell(); } // get output device to use @@ -3136,7 +3163,7 @@ uno::Sequence< lang::Locale > SAL_CALL SwXTextDocument::getDocumentLanguages( } } - //get languages from "drawobject" + //TODO/mba: it's a strange concept that a view is needed to retrieve core data SwWrtShell *pWrtSh = pDocShell->GetWrtShell(); SdrView *pSdrView = pWrtSh->GetDrawView(); @@ -3807,7 +3834,7 @@ void SwXDocumentPropertyHelper::onChange() m_pDoc->SetModified(); } -SwViewOptionAdjust_Impl::SwViewOptionAdjust_Impl( SwWrtShell& rSh, const SwViewOption &rViewOptions ) : +SwViewOptionAdjust_Impl::SwViewOptionAdjust_Impl( ViewShell& rSh, const SwViewOption &rViewOptions ) : m_rShell( rSh ), m_aOldViewOptions( rViewOptions ) { diff --git a/sw/source/ui/uno/unotxvw.cxx b/sw/source/ui/uno/unotxvw.cxx index 3340bc98c971..c80ff0e15fdd 100644..100755 --- a/sw/source/ui/uno/unotxvw.cxx +++ b/sw/source/ui/uno/unotxvw.cxx @@ -82,7 +82,7 @@ #include <unocrsrhelper.hxx> #include <unotextrange.hxx> #include <sfx2/docfile.hxx> - +#include <switerator.hxx> #include "swdtflvr.hxx" #include <vcl/svapp.hxx> @@ -399,8 +399,8 @@ sal_Bool SwXTextView::select(const uno::Any& aInterface) throw( lang::IllegalArg { rSh.EnterStdMode(); rSh.GotoMark(pMark); + return sal_True; } - return sal_True; } // IndexMark, Index, TextField, Draw, Section, Footnote, Paragraph // @@ -549,9 +549,7 @@ uno::Any SwXTextView::getSelection(void) throw( uno::RuntimeException ) const SwFrmFmt* pFmt = rSh.GetFlyFrmFmt(); if (pFmt) { - SwXFrame* pxFrame = (SwXFrame*)SwClientIter((SwFrmFmt&)*pFmt). - First(TYPE(SwXFrame)); - + SwXFrame* pxFrame = SwIterator<SwXFrame,SwFmt>::FirstElement(*pFmt); if(pxFrame) //das einzige gemeinsame interface fuer alle Frames { aRef = uno::Reference< uno::XInterface >((cppu::OWeakObject*)pxFrame, uno::UNO_QUERY); @@ -991,7 +989,7 @@ uno::Any SAL_CALL SwXTextView::getPropertyValue( sal_Int32 nCount = -1; if (nWID == WID_PAGE_COUNT) - nCount = m_pView->GetDocShell()->GetDoc()->GetPageCount(); + nCount = m_pView->GetWrtShell().GetPageCount(); else // WID_LINE_COUNT nCount = m_pView->GetWrtShell().GetLineCount( sal_False /*of whole document*/ ); aRet <<= nCount; diff --git a/sw/source/ui/utlui/navipi.cxx b/sw/source/ui/utlui/navipi.cxx index 20ef695485bc..1d0e41882528 100644 --- a/sw/source/ui/utlui/navipi.cxx +++ b/sw/source/ui/utlui/navipi.cxx @@ -750,8 +750,10 @@ SwNavigationPI::SwNavigationPI( SfxBindings* _pBindings, &aContentToolBox, SW_RES(NF_PAGE )); pEdit->SetActionHdl(LINK(this, SwNavigationPI, EditAction)); pEdit->SetGetFocusHdl(LINK(this, SwNavigationPI, EditGetFocus)); - pEdit->SetModifyHdl(LINK(this, SwNavigationPI, PageEditModifyHdl)); pEdit->SetAccessibleName(pEdit->GetQuickHelpText()); + pEdit->SetUpHdl(LINK(this, SwNavigationPI, PageEditModifyHdl)); + pEdit->SetDownHdl(LINK(this, SwNavigationPI, PageEditModifyHdl)); + bPageCtrlsVisible = sal_True; //doppelte Separatoren sind nicht erlaubt, also muss diff --git a/sw/source/ui/utlui/uitool.cxx b/sw/source/ui/utlui/uitool.cxx index 81a202107b4b..bef821dff6df 100644 --- a/sw/source/ui/utlui/uitool.cxx +++ b/sw/source/ui/utlui/uitool.cxx @@ -524,7 +524,7 @@ void SfxToSwPageDescAttr( const SwWrtShell& rShell, SfxItemSet& rSet ) SwPageDesc* pDesc = ((SwWrtShell&)rShell).FindPageDescByName( rDescName, sal_True ); if( pDesc ) - pDesc->Add( &aPgDesc ); + aPgDesc.RegisterToPageDesc( *pDesc ); } rSet.ClearItem( SID_ATTR_PARA_MODEL ); bChanged = sal_True; @@ -537,7 +537,7 @@ void SfxToSwPageDescAttr( const SwWrtShell& rShell, SfxItemSet& rSet ) { if( ((SwFmtPageDesc*)pItem)->GetPageDesc() ) { - ((SwFmtPageDesc*)pItem)->GetPageDesc()->Add(&aPgDesc); + aPgDesc.RegisterToPageDesc( *((SwFmtPageDesc*)pItem)->GetPageDesc() ); } } } diff --git a/sw/source/ui/vba/vbainformationhelper.cxx b/sw/source/ui/vba/vbainformationhelper.cxx index e46f62961541..51fb2b7f9f3a 100644 --- a/sw/source/ui/vba/vbainformationhelper.cxx +++ b/sw/source/ui/vba/vbainformationhelper.cxx @@ -33,6 +33,7 @@ #include <doc.hxx> #include <vbahelper/vbahelper.hxx> #include <swtypes.hxx> +#include <viewsh.hxx> using namespace ::ooo::vba; using namespace ::com::sun::star; @@ -59,7 +60,9 @@ double SwVbaInformationHelper::handleWdVerticalPositionRelativeToPage( const css sal_Int32 nCurrentPos = xTVCursor->getPosition().Y; sal_Int32 nCurrentPage = handleWdActiveEndPageNumber( xTVCursor ); - sal_Int32 nPageHeight = word::getDocShell( xModel )->GetDoc()->GetPageSize( nCurrentPage, sal_False ).Height(); + SwDoc* pDoc = word::getDocShell( xModel )->GetDoc(); + ViewShell* pViewSh = pDoc->GetCurrentViewShell(); + sal_Int32 nPageHeight = pViewSh ? pViewSh->GetPageSize( nCurrentPage, sal_False ).Height() : 0; // FIXME: handle multipul page style // it is very strange that the curros position is incorrect when open Word file. // e.g. if current cursor in the top left of the text body of the first page without header, diff --git a/sw/source/ui/vba/wordvbahelper.cxx b/sw/source/ui/vba/wordvbahelper.cxx index aa63b8b21712..fa1f5092c88d 100644 --- a/sw/source/ui/vba/wordvbahelper.cxx +++ b/sw/source/ui/vba/wordvbahelper.cxx @@ -40,6 +40,7 @@ #include <unotxdoc.hxx> #include <doc.hxx> #include <view.hxx> +#include <viewsh.hxx> using namespace ::com::sun::star; using namespace ::ooo::vba; @@ -95,7 +96,8 @@ uno::Reference< style::XStyle > getCurrentPageStyle( const uno::Reference< frame sal_Int32 getPageCount( const uno::Reference< frame::XModel>& xModel ) throw (uno::RuntimeException) { SwDocShell* pDocShell = getDocShell( xModel ); - return pDocShell ? pDocShell->GetDoc()->GetPageCount() : 0; + ViewShell* pViewSh = pDocShell ? pDocShell->GetDoc()->GetCurrentViewShell() : 0; + return pViewSh ? pViewSh->GetPageCount() : 0; } uno::Reference< style::XStyle > getDefaultParagraphStyle( const uno::Reference< frame::XModel >& xModel ) throw (uno::RuntimeException) diff --git a/sw/source/ui/wrtsh/wrtsh1.cxx b/sw/source/ui/wrtsh/wrtsh1.cxx index efa944a9e70f..b1786c42108f 100644 --- a/sw/source/ui/wrtsh/wrtsh1.cxx +++ b/sw/source/ui/wrtsh/wrtsh1.cxx @@ -97,6 +97,7 @@ #include <ndtxt.hxx> #include <editeng/acorrcfg.hxx> #include <IMark.hxx> +#include <sfx2/bindings.hxx> // -> #111827# #include <SwRewriter.hxx> @@ -1247,6 +1248,9 @@ void SwWrtShell::NumOrBulletOn(sal_Bool bNum) } aFmt.SetBulletChar( numfunc::GetBulletChar(static_cast<sal_uInt8>(nLevel))); aFmt.SetNumberingType(SVX_NUM_CHAR_SPECIAL); + // #i93908# clear suffix for bullet lists + aFmt.SetPrefix(::rtl::OUString()); + aFmt.SetSuffix(::rtl::OUString()); } aNumRule.Set(static_cast<sal_uInt16>(nLevel), aFmt); } @@ -1304,6 +1308,9 @@ void SwWrtShell::NumOrBulletOn(sal_Bool bNum) } aFmt.SetBulletChar( numfunc::GetBulletChar(nLvl) ); aFmt.SetNumberingType(SVX_NUM_CHAR_SPECIAL); + // #i93908# clear suffix for bullet lists + aFmt.SetPrefix(::rtl::OUString()); + aFmt.SetSuffix(::rtl::OUString()); } // --> OD 2009-08-26 #i95907# @@ -1819,4 +1826,12 @@ String SwWrtShell::GetSelDescr() const return aResult; } +void SwWrtShell::ApplyViewOptions( const SwViewOption &rOpt ) +{ + SwFEShell::ApplyViewOptions( rOpt ); + //#i115062# invalidate meta character slot + GetView().GetViewFrame()->GetBindings().Invalidate( FN_VIEW_META_CHARS ); +} + + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/uiconfig/sglobal/menubar/menubar.xml b/sw/uiconfig/sglobal/menubar/menubar.xml index 46b5ba3ae5c4..e643158b2506 100644..100755 --- a/sw/uiconfig/sglobal/menubar/menubar.xml +++ b/sw/uiconfig/sglobal/menubar/menubar.xml @@ -196,8 +196,6 @@ <menu:menupopup> <menu:menuitem menu:id=".uno:InsertObject"/> <menu:menuitem menu:id=".uno:InsertPlugin"/> - <menu:menuitem menu:id=".uno:InsertSound"/> - <menu:menuitem menu:id=".uno:InsertVideo"/> <menu:menuitem menu:id=".uno:InsertObjectStarMath"/> <menu:menuitem menu:id=".uno:InsertObjectChart"/> </menu:menupopup> diff --git a/sw/uiconfig/sweb/menubar/menubar.xml b/sw/uiconfig/sweb/menubar/menubar.xml index d208094c854a..552019d6cf86 100644..100755 --- a/sw/uiconfig/sweb/menubar/menubar.xml +++ b/sw/uiconfig/sweb/menubar/menubar.xml @@ -144,8 +144,6 @@ <menu:menupopup> <menu:menuitem menu:id=".uno:InsertObject"/> <menu:menuitem menu:id=".uno:InsertPlugin"/> - <menu:menuitem menu:id=".uno:InsertSound"/> - <menu:menuitem menu:id=".uno:InsertVideo"/> <menu:menuitem menu:id=".uno:InsertObjectStarMath"/> <menu:menuitem menu:id=".uno:InsertObjectChart"/> </menu:menupopup> diff --git a/sw/uiconfig/swform/menubar/menubar.xml b/sw/uiconfig/swform/menubar/menubar.xml index 33347d19cf23..7e5f14f5d58c 100644..100755 --- a/sw/uiconfig/swform/menubar/menubar.xml +++ b/sw/uiconfig/swform/menubar/menubar.xml @@ -196,8 +196,6 @@ <menu:menupopup> <menu:menuitem menu:id=".uno:InsertObject"/> <menu:menuitem menu:id=".uno:InsertPlugin"/> - <menu:menuitem menu:id=".uno:InsertSound"/> - <menu:menuitem menu:id=".uno:InsertVideo"/> <menu:menuitem menu:id=".uno:InsertObjectStarMath"/> <menu:menuitem menu:id=".uno:InsertObjectChart"/> </menu:menupopup> diff --git a/sw/uiconfig/swreport/menubar/menubar.xml b/sw/uiconfig/swreport/menubar/menubar.xml index 33347d19cf23..7e5f14f5d58c 100644..100755 --- a/sw/uiconfig/swreport/menubar/menubar.xml +++ b/sw/uiconfig/swreport/menubar/menubar.xml @@ -196,8 +196,6 @@ <menu:menupopup> <menu:menuitem menu:id=".uno:InsertObject"/> <menu:menuitem menu:id=".uno:InsertPlugin"/> - <menu:menuitem menu:id=".uno:InsertSound"/> - <menu:menuitem menu:id=".uno:InsertVideo"/> <menu:menuitem menu:id=".uno:InsertObjectStarMath"/> <menu:menuitem menu:id=".uno:InsertObjectChart"/> </menu:menupopup> diff --git a/sw/uiconfig/swriter/menubar/menubar.xml b/sw/uiconfig/swriter/menubar/menubar.xml index ce213145ddb1..02107d0088a2 100644..100755 --- a/sw/uiconfig/swriter/menubar/menubar.xml +++ b/sw/uiconfig/swriter/menubar/menubar.xml @@ -199,8 +199,6 @@ <menu:menupopup> <menu:menuitem menu:id=".uno:InsertObject"/> <menu:menuitem menu:id=".uno:InsertPlugin"/> - <menu:menuitem menu:id=".uno:InsertSound"/> - <menu:menuitem menu:id=".uno:InsertVideo"/> <menu:menuitem menu:id=".uno:InsertObjectStarMath"/> <menu:menuitem menu:id=".uno:InsertObjectChart"/> </menu:menupopup> diff --git a/sw/uiconfig/swxform/menubar/menubar.xml b/sw/uiconfig/swxform/menubar/menubar.xml index 37ff25cdf990..ff139ef3654d 100644..100755 --- a/sw/uiconfig/swxform/menubar/menubar.xml +++ b/sw/uiconfig/swxform/menubar/menubar.xml @@ -197,8 +197,6 @@ <menu:menupopup> <menu:menuitem menu:id=".uno:InsertObject"/> <menu:menuitem menu:id=".uno:InsertPlugin"/> - <menu:menuitem menu:id=".uno:InsertSound"/> - <menu:menuitem menu:id=".uno:InsertVideo"/> <menu:menuitem menu:id=".uno:InsertObjectStarMath"/> <menu:menuitem menu:id=".uno:InsertObjectChart"/> </menu:menupopup> |