/************************************************************** * * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * *************************************************************/ #ifndef _REDLINE_HXX #define _REDLINE_HXX #include #include #define _SVSTDARR_USHORTS #include #include #include #include class SfxItemSet; class SwView; class SwRedlineExtraData { SwRedlineExtraData( const SwRedlineExtraData& ); SwRedlineExtraData& operator=( const SwRedlineExtraData& ); protected: SwRedlineExtraData() {} public: virtual ~SwRedlineExtraData(); virtual SwRedlineExtraData* CreateNew() const = 0; virtual void Accept( SwPaM& rPam ) const; virtual void Reject( SwPaM& rPam ) const; virtual int operator == ( const SwRedlineExtraData& ) const; }; class SwRedlineExtraData_FmtColl : public SwRedlineExtraData { String sFmtNm; SfxItemSet* pSet; sal_uInt16 nPoolId; public: SwRedlineExtraData_FmtColl( const String& rColl, sal_uInt16 nPoolFmtId, const SfxItemSet* pSet = 0 ); virtual ~SwRedlineExtraData_FmtColl(); virtual SwRedlineExtraData* CreateNew() const; virtual void Reject( SwPaM& rPam ) const; virtual int operator == ( const SwRedlineExtraData& ) const; void SetItemSet( const SfxItemSet& rSet ); }; class SwRedlineExtraData_Format : public SwRedlineExtraData { SvUShorts aWhichIds; SwRedlineExtraData_Format( const SwRedlineExtraData_Format& rCpy ); public: SwRedlineExtraData_Format( const SfxItemSet& rSet ); virtual ~SwRedlineExtraData_Format(); virtual SwRedlineExtraData* CreateNew() const; virtual void Reject( SwPaM& rPam ) const; virtual int operator == ( const SwRedlineExtraData& ) const; }; class SW_DLLPUBLIC SwRedlineData { friend class SwRedline; SwRedlineData* pNext; // Verweis auf weitere Daten SwRedlineExtraData* pExtraData; String sComment; DateTime aStamp; RedlineType_t eType; sal_uInt16 nAuthor, nSeqNo; public: SwRedlineData( RedlineType_t eT, sal_uInt16 nAut ); SwRedlineData( const SwRedlineData& rCpy, sal_Bool bCpyNext = sal_True ); // fuer sw3io: pNext/pExtraData gehen in eigenen Besitz ueber! SwRedlineData( RedlineType_t eT, sal_uInt16 nAut, const DateTime& rDT, const String& rCmnt, SwRedlineData* pNxt, SwRedlineExtraData* pExtraData = 0 ); ~SwRedlineData(); int operator==( const SwRedlineData& rCmp ) const { return nAuthor == rCmp.nAuthor && eType == rCmp.eType && sComment == rCmp.sComment && (( !pNext && !rCmp.pNext ) || ( pNext && rCmp.pNext && *pNext == *rCmp.pNext )) && (( !pExtraData && !rCmp.pExtraData ) || ( pExtraData && rCmp.pExtraData && *pExtraData == *rCmp.pExtraData )); } int operator!=( const SwRedlineData& rCmp ) const { return !operator==( rCmp ); } RedlineType_t GetType() const { return ((RedlineType_t)(eType & nsRedlineType_t::REDLINE_NO_FLAG_MASK)); } RedlineType_t GetRealType() const { return eType; } sal_uInt16 GetAuthor() const { return nAuthor; } const String& GetComment() const { return sComment; } const DateTime& GetTimeStamp() const { return aStamp; } inline const SwRedlineData* Next() const{ return pNext; } void SetComment( const String& rS ) { sComment = rS; } void SetTimeStamp( const DateTime& rDT ) { aStamp = rDT; } void SetAutoFmtFlag() { eType = (RedlineType_t)(eType | nsRedlineType_t::REDLINE_FORM_AUTOFMT); } int CanCombine( const SwRedlineData& rCmp ) const { return nAuthor == rCmp.nAuthor && eType == rCmp.eType && sComment == rCmp.sComment && GetTimeStamp() == rCmp.GetTimeStamp() && (( !pNext && !rCmp.pNext ) || ( pNext && rCmp.pNext && pNext->CanCombine( *rCmp.pNext ))) && (( !pExtraData && !rCmp.pExtraData ) || ( pExtraData && rCmp.pExtraData && *pExtraData == *rCmp.pExtraData )); } // ExtraData wird kopiert, der Pointer geht also NICHT in den Besitz // des RedlineObjectes! void SetExtraData( const SwRedlineExtraData* pData ); const SwRedlineExtraData* GetExtraData() const { return pExtraData; } // fuers UI-seitige zusammenfassen von Redline-Actionen. Wird z.Z. nur // fuers Autoformat mit Redline benoetigt. Der Wert != 0 bedeutet dabei, // das es noch weitere geben kann! sal_uInt16 GetSeqNo() const { return nSeqNo; } void SetSeqNo( sal_uInt16 nNo ) { nSeqNo = nNo; } String GetDescr() const; }; class SW_DLLPUBLIC SwRedline : public SwPaM { SwRedlineData* pRedlineData; SwNodeIndex* pCntntSect; sal_Bool bDelLastPara : 1; sal_Bool bIsLastParaDelete : 1; sal_Bool bIsVisible : 1; void MoveToSection(); void CopyToSection(); void DelCopyOfSection(); void MoveFromSection(); public: SwRedline( RedlineType_t eType, const SwPaM& rPam ); SwRedline( const SwRedlineData& rData, const SwPaM& rPam ); SwRedline( const SwRedlineData& rData, const SwPosition& rPos ); // fuer sw3io: pData geht in eigenen Besitz ueber! SwRedline(SwRedlineData* pData, const SwPosition& rPos, sal_Bool bVsbl, sal_Bool bDelLP, sal_Bool bIsPD) : SwPaM( rPos ), pRedlineData( pData ), pCntntSect( 0 ), bDelLastPara( bDelLP ), bIsLastParaDelete( bIsPD ), bIsVisible( bVsbl ) {} SwRedline( const SwRedline& ); virtual ~SwRedline(); SwNodeIndex* GetContentIdx() const { return pCntntSect; } // fuers Undo void SetContentIdx( const SwNodeIndex* ); sal_Bool IsVisible() const { return bIsVisible; } sal_Bool IsDelLastPara() const { return bDelLastPara; } // das sal_Bool besagt, ob nach dem setzen der Pos kein Bereich mehr // aufgespannt ist. -> sal_True, ansonten Bereich und sal_False void SetStart( const SwPosition& rPos, SwPosition* pSttPtr = 0 ) { if( !pSttPtr ) pSttPtr = Start(); *pSttPtr = rPos; } void SetEnd( const SwPosition& rPos, SwPosition* pEndPtr = 0 ) { if( !pEndPtr ) pEndPtr = End(); *pEndPtr = rPos; } // liegt eine gueltige Selektion vor? sal_Bool HasValidRange() const; const SwRedlineData& GetRedlineData(sal_uInt16 nPos = 0) const; int operator==( const SwRedlineData& rCmp ) const { return *pRedlineData == rCmp; } int operator!=( const SwRedlineData& rCmp ) const { return *pRedlineData != rCmp; } void SetAutoFmtFlag() { pRedlineData->SetAutoFmtFlag(); } sal_uInt16 GetStackCount() const; sal_uInt16 GetAuthor( sal_uInt16 nPos = 0) const; const String& GetAuthorString( sal_uInt16 nPos = 0 ) const; const DateTime& GetTimeStamp( sal_uInt16 nPos = 0) const; RedlineType_t GetRealType( sal_uInt16 nPos = 0 ) const; RedlineType_t GetType( sal_uInt16 nPos = 0) const { return ( (RedlineType_t)(GetRealType( nPos ) & nsRedlineType_t::REDLINE_NO_FLAG_MASK)); } const String& GetComment( sal_uInt16 nPos = 0 ) const; void SetComment( const String& rS ) { pRedlineData->SetComment( rS ); } // ExtraData wird kopiert, der Pointer geht also NICHT in den Besitz // des RedlineObjectes! void SetExtraData( const SwRedlineExtraData* pData ) { pRedlineData->SetExtraData( pData ); } const SwRedlineExtraData* GetExtraData() const { return pRedlineData->GetExtraData(); } // fuers UI-seitige zusammenfassen von Redline-Actionen. Wird z.Z. nur // fuers Autoformat mit Redline benoetigt. Der Wert != 0 bedeutet dabei, // das es noch weitere geben kann! sal_uInt16 GetSeqNo() const { return pRedlineData->GetSeqNo(); } void SetSeqNo( sal_uInt16 nNo ) { pRedlineData->SetSeqNo( nNo ); } // Beim Hide/ShowOriginal wird 2 mal ueber die Liste gelaufen, damit // die Del-Redlines per Copy und Delete versteckt werden. Beim Move // wird sonst die Attributierung falsch behandelt. // Alle anderen Aufrufer muessen immer 0 angeben. void CallDisplayFunc( sal_uInt16 nLoop = 0 ); void Show( sal_uInt16 nLoop = 0 ); void Hide( sal_uInt16 nLoop = 0 ); void ShowOriginal( sal_uInt16 nLoop = 0 ); // calculates the intersection with text node number nNdIdx void CalcStartEnd( sal_uLong nNdIdx, sal_uInt16& nStart, sal_uInt16& nEnd ) const; void InvalidateRange(); // das Layout anstossen sal_Bool IsOwnRedline( const SwRedline& rRedl ) const { return GetAuthor() == rRedl.GetAuthor(); } sal_Bool CanCombine( const SwRedline& rRedl ) const; void PushData( const SwRedline& rRedl, sal_Bool bOwnAsNext = sal_True ); sal_Bool PopData(); // #111827# /** Returns textual description of this a redline data element of this redline. @param nPos index of the redline data element to describe The textual description of the selected element contains the kind of redline and the possibly shortened text of the redline. @return textual description of the selected redline data element */ String GetDescr(sal_uInt16 nPos = 0); int operator==( const SwRedline& ) const; int operator<( const SwRedline& ) const; }; class SW_DLLPUBLIC SwRedlineHint : public SfxHint { #define SWREDLINE_INSERTED 1 #define SWREDLINE_REMOVED 2 #define SWREDLINE_FOCUS 3 #define SWREDLINE_CHANGED 4 #define SWREDLINE_LANGUAGE 5 const SwRedline* pRedline; sal_Int16 nWhich; const SwView* pView; public: SwRedlineHint( const SwRedline* p, sal_Int16 n, const SwView* pV = 0) : pRedline(p) , nWhich(n) , pView(pV) {} TYPEINFO(); const SwRedline* GetRedline() const { return pRedline; } sal_Int16 Which() const { return nWhich; } const SwView* GetView() const { return pView; } }; #endif