xref: /trunk/main/sw/inc/redline.hxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 #ifndef _REDLINE_HXX
28 #define _REDLINE_HXX
29 
30 #include <tools/datetime.hxx>
31 #include <tools/string.hxx>
32 
33 #define _SVSTDARR_USHORTS
34 #include <svl/svstdarr.hxx>
35 #include <pam.hxx>
36 
37 #include <IDocumentRedlineAccess.hxx>
38 
39 #include <svl/smplhint.hxx>
40 
41 class SfxItemSet;
42 class SwView;
43 
44 class SwRedlineExtraData
45 {
46     SwRedlineExtraData( const SwRedlineExtraData& );
47     SwRedlineExtraData& operator=( const SwRedlineExtraData& );
48 
49 protected:
50     SwRedlineExtraData() {}
51 
52 public:
53     virtual ~SwRedlineExtraData();
54     virtual SwRedlineExtraData* CreateNew() const = 0;
55 
56     virtual void Accept( SwPaM& rPam ) const;
57     virtual void Reject( SwPaM& rPam ) const;
58     virtual int operator == ( const SwRedlineExtraData& ) const;
59 };
60 
61 class SwRedlineExtraData_FmtColl : public SwRedlineExtraData
62 {
63     String sFmtNm;
64     SfxItemSet* pSet;
65     sal_uInt16 nPoolId;
66 public:
67     SwRedlineExtraData_FmtColl( const String& rColl, sal_uInt16 nPoolFmtId,
68                                 const SfxItemSet* pSet = 0 );
69     virtual ~SwRedlineExtraData_FmtColl();
70     virtual SwRedlineExtraData* CreateNew() const;
71     virtual void Reject( SwPaM& rPam ) const;
72     virtual int operator == ( const SwRedlineExtraData& ) const;
73 
74     void SetItemSet( const SfxItemSet& rSet );
75 };
76 
77 class SwRedlineExtraData_Format : public SwRedlineExtraData
78 {
79     SvUShorts aWhichIds;
80 
81     SwRedlineExtraData_Format( const SwRedlineExtraData_Format& rCpy );
82 
83 public:
84     SwRedlineExtraData_Format( const SfxItemSet& rSet );
85     virtual ~SwRedlineExtraData_Format();
86     virtual SwRedlineExtraData* CreateNew() const;
87     virtual void Reject( SwPaM& rPam ) const;
88     virtual int operator == ( const SwRedlineExtraData& ) const;
89 };
90 
91 
92 class SW_DLLPUBLIC SwRedlineData
93 {
94     friend class SwRedline;
95     SwRedlineData* pNext;       // Verweis auf weitere Daten
96     SwRedlineExtraData* pExtraData;
97 
98     String sComment;
99     DateTime aStamp;
100     RedlineType_t eType;
101     sal_uInt16 nAuthor, nSeqNo;
102 
103 public:
104     SwRedlineData( RedlineType_t eT, sal_uInt16 nAut );
105     SwRedlineData( const SwRedlineData& rCpy, sal_Bool bCpyNext = sal_True );
106 
107     // fuer sw3io: pNext/pExtraData gehen in eigenen Besitz ueber!
108     SwRedlineData( RedlineType_t eT, sal_uInt16 nAut, const DateTime& rDT,
109                    const String& rCmnt, SwRedlineData* pNxt,
110                     SwRedlineExtraData* pExtraData = 0 );
111 
112     ~SwRedlineData();
113 
114     int operator==( const SwRedlineData& rCmp ) const
115         {
116             return nAuthor == rCmp.nAuthor &&
117                     eType == rCmp.eType &&
118                     sComment == rCmp.sComment &&
119                     (( !pNext && !rCmp.pNext ) ||
120                         ( pNext && rCmp.pNext && *pNext == *rCmp.pNext )) &&
121                     (( !pExtraData && !rCmp.pExtraData ) ||
122                         ( pExtraData && rCmp.pExtraData &&
123                             *pExtraData == *rCmp.pExtraData ));
124         }
125     int operator!=( const SwRedlineData& rCmp ) const
126         {   return !operator==( rCmp ); }
127 
128     RedlineType_t GetType() const
129   { return ((RedlineType_t)(eType & nsRedlineType_t::REDLINE_NO_FLAG_MASK)); }
130     RedlineType_t GetRealType() const { return eType; }
131     sal_uInt16 GetAuthor() const                { return nAuthor; }
132     const String& GetComment() const        { return sComment; }
133     const DateTime& GetTimeStamp() const    { return aStamp; }
134     inline const SwRedlineData* Next() const{ return pNext; }
135 
136     void SetComment( const String& rS )     { sComment = rS; }
137     void SetTimeStamp( const DateTime& rDT ) { aStamp = rDT; }
138 
139     void SetAutoFmtFlag()
140   { eType = (RedlineType_t)(eType | nsRedlineType_t::REDLINE_FORM_AUTOFMT); }
141     int CanCombine( const SwRedlineData& rCmp ) const
142         {
143             return nAuthor == rCmp.nAuthor &&
144                     eType == rCmp.eType &&
145                     sComment == rCmp.sComment &&
146                     GetTimeStamp() == rCmp.GetTimeStamp() &&
147                     (( !pNext && !rCmp.pNext ) ||
148                         ( pNext && rCmp.pNext &&
149                         pNext->CanCombine( *rCmp.pNext ))) &&
150                     (( !pExtraData && !rCmp.pExtraData ) ||
151                         ( pExtraData && rCmp.pExtraData &&
152                             *pExtraData == *rCmp.pExtraData ));
153         }
154 
155     // ExtraData wird kopiert, der Pointer geht also NICHT in den Besitz
156     // des RedlineObjectes!
157     void SetExtraData( const SwRedlineExtraData* pData );
158     const SwRedlineExtraData* GetExtraData() const { return pExtraData; }
159 
160     // fuers UI-seitige zusammenfassen von Redline-Actionen. Wird z.Z. nur
161     // fuers Autoformat mit Redline benoetigt. Der Wert != 0 bedeutet dabei,
162     // das es noch weitere geben kann!
163     sal_uInt16 GetSeqNo() const                     { return nSeqNo; }
164     void SetSeqNo( sal_uInt16 nNo )                 { nSeqNo = nNo; }
165 
166     String GetDescr() const;
167 };
168 
169 
170 class SW_DLLPUBLIC SwRedline : public SwPaM
171 {
172     SwRedlineData* pRedlineData;
173     SwNodeIndex* pCntntSect;
174     sal_Bool bDelLastPara : 1;
175     sal_Bool bIsLastParaDelete : 1;
176     sal_Bool bIsVisible : 1;
177 
178     void MoveToSection();
179     void CopyToSection();
180     void DelCopyOfSection();
181     void MoveFromSection();
182 
183 public:
184     SwRedline( RedlineType_t eType, const SwPaM& rPam );
185     SwRedline( const SwRedlineData& rData, const SwPaM& rPam );
186     SwRedline( const SwRedlineData& rData, const SwPosition& rPos );
187     // fuer sw3io: pData geht in eigenen Besitz ueber!
188     SwRedline(SwRedlineData* pData, const SwPosition& rPos, sal_Bool bVsbl,
189                sal_Bool bDelLP, sal_Bool bIsPD) :
190         SwPaM( rPos ), pRedlineData( pData ), pCntntSect( 0 ),
191         bDelLastPara( bDelLP ), bIsLastParaDelete( bIsPD ), bIsVisible( bVsbl )
192     {}
193     SwRedline( const SwRedline& );
194     virtual ~SwRedline();
195 
196     SwNodeIndex* GetContentIdx() const { return pCntntSect; }
197     // fuers Undo
198     void SetContentIdx( const SwNodeIndex* );
199 
200     sal_Bool IsVisible() const { return bIsVisible; }
201     sal_Bool IsDelLastPara() const { return bDelLastPara; }
202 
203     // das sal_Bool besagt, ob nach dem setzen der Pos kein Bereich mehr
204     // aufgespannt ist. -> sal_True, ansonten Bereich und sal_False
205     void SetStart( const SwPosition& rPos, SwPosition* pSttPtr = 0 )
206     {
207         if( !pSttPtr ) pSttPtr = Start();
208         *pSttPtr = rPos;
209     }
210     void SetEnd( const SwPosition& rPos, SwPosition* pEndPtr = 0 )
211     {
212         if( !pEndPtr ) pEndPtr = End();
213         *pEndPtr = rPos;
214     }
215     // liegt eine gueltige Selektion vor?
216     sal_Bool HasValidRange() const;
217 
218     const SwRedlineData& GetRedlineData(sal_uInt16 nPos = 0) const;
219     int operator==( const SwRedlineData& rCmp ) const
220         { return *pRedlineData == rCmp; }
221     int operator!=( const SwRedlineData& rCmp ) const
222         { return *pRedlineData != rCmp; }
223     void SetAutoFmtFlag()               { pRedlineData->SetAutoFmtFlag(); }
224 
225     sal_uInt16 GetStackCount() const;
226     sal_uInt16 GetAuthor( sal_uInt16 nPos = 0) const;
227     const String& GetAuthorString( sal_uInt16 nPos = 0 ) const;
228     const DateTime& GetTimeStamp( sal_uInt16 nPos = 0) const;
229     RedlineType_t GetRealType( sal_uInt16 nPos = 0 ) const;
230     RedlineType_t GetType( sal_uInt16 nPos = 0) const
231   { return ( (RedlineType_t)(GetRealType( nPos ) & nsRedlineType_t::REDLINE_NO_FLAG_MASK)); }
232     const String& GetComment( sal_uInt16 nPos = 0 ) const;
233 
234     void SetComment( const String& rS ) { pRedlineData->SetComment( rS ); }
235 
236     // ExtraData wird kopiert, der Pointer geht also NICHT in den Besitz
237     // des RedlineObjectes!
238     void SetExtraData( const SwRedlineExtraData* pData )
239         { pRedlineData->SetExtraData( pData ); }
240     const SwRedlineExtraData* GetExtraData() const
241         { return pRedlineData->GetExtraData(); }
242 
243     // fuers UI-seitige zusammenfassen von Redline-Actionen. Wird z.Z. nur
244     // fuers Autoformat mit Redline benoetigt. Der Wert != 0 bedeutet dabei,
245     // das es noch weitere geben kann!
246     sal_uInt16 GetSeqNo() const             { return pRedlineData->GetSeqNo(); }
247     void SetSeqNo( sal_uInt16 nNo )         { pRedlineData->SetSeqNo( nNo ); }
248 
249     // Beim Hide/ShowOriginal wird 2 mal ueber die Liste gelaufen, damit
250     //  die Del-Redlines per Copy und Delete versteckt werden. Beim Move
251     //  wird sonst die Attributierung falsch behandelt.
252     // Alle anderen Aufrufer muessen immer 0 angeben.
253     void CallDisplayFunc( sal_uInt16 nLoop = 0 );
254     void Show( sal_uInt16 nLoop = 0 );
255     void Hide( sal_uInt16 nLoop = 0 );
256     void ShowOriginal( sal_uInt16 nLoop = 0 );
257 
258     // calculates the intersection with text node number nNdIdx
259     void CalcStartEnd( sal_uLong nNdIdx, sal_uInt16& nStart, sal_uInt16& nEnd ) const;
260 
261     void InvalidateRange();     // das Layout anstossen
262 
263     sal_Bool IsOwnRedline( const SwRedline& rRedl ) const
264         { return GetAuthor() == rRedl.GetAuthor(); }
265     sal_Bool CanCombine( const SwRedline& rRedl ) const;
266 
267     void PushData( const SwRedline& rRedl, sal_Bool bOwnAsNext = sal_True );
268     sal_Bool PopData();
269 
270     // #111827#
271     /**
272        Returns textual description of this a redline data element of
273        this redline.
274 
275        @param nPos index of the redline data element to describe
276 
277        The textual description of the selected element contains the
278        kind of redline and the possibly shortened text of the redline.
279 
280        @return textual description of the selected redline data element
281      */
282     String GetDescr(sal_uInt16 nPos = 0);
283 
284     int operator==( const SwRedline& ) const;
285     int operator<( const SwRedline& ) const;
286 };
287 
288 class SW_DLLPUBLIC SwRedlineHint : public SfxHint
289 {
290 #define SWREDLINE_INSERTED  1
291 #define SWREDLINE_REMOVED   2
292 #define SWREDLINE_FOCUS     3
293 #define SWREDLINE_CHANGED   4
294 #define SWREDLINE_LANGUAGE  5
295 
296     const SwRedline* pRedline;
297     sal_Int16 nWhich;
298     const SwView* pView;
299 
300 public:
301     SwRedlineHint( const SwRedline* p, sal_Int16 n, const SwView* pV = 0)
302         : pRedline(p)
303         , nWhich(n)
304         , pView(pV)
305         {}
306 
307     TYPEINFO();
308     const SwRedline* GetRedline() const { return pRedline; }
309     sal_Int16 Which() const { return nWhich; }
310         const SwView* GetView() const { return pView; }
311 };
312 
313 
314 #endif
315