xref: /AOO41X/main/sw/source/ui/misc/redlndlg.cxx (revision efeef26f81c84063fb0a91bde3856d4a51172d90)
1*efeef26fSAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*efeef26fSAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*efeef26fSAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*efeef26fSAndrew Rist  * distributed with this work for additional information
6*efeef26fSAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*efeef26fSAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*efeef26fSAndrew Rist  * "License"); you may not use this file except in compliance
9*efeef26fSAndrew Rist  * with the License.  You may obtain a copy of the License at
10cdf0e10cSrcweir  *
11*efeef26fSAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir  *
13*efeef26fSAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*efeef26fSAndrew Rist  * software distributed under the License is distributed on an
15*efeef26fSAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*efeef26fSAndrew Rist  * KIND, either express or implied.  See the License for the
17*efeef26fSAndrew Rist  * specific language governing permissions and limitations
18*efeef26fSAndrew Rist  * under the License.
19cdf0e10cSrcweir  *
20*efeef26fSAndrew Rist  *************************************************************/
21*efeef26fSAndrew Rist 
22*efeef26fSAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_sw.hxx"
26cdf0e10cSrcweir 
27cdf0e10cSrcweir 
28cdf0e10cSrcweir #define _SVSTDARR_STRINGSSORTDTOR
29cdf0e10cSrcweir #define _SVSTDARR_USHORTSSORT
30cdf0e10cSrcweir #define _SVSTDARR_USHORTS
31cdf0e10cSrcweir 
32cdf0e10cSrcweir 
33cdf0e10cSrcweir #include <redline.hxx>
34cdf0e10cSrcweir #include <tools/datetime.hxx>
35cdf0e10cSrcweir #include <vcl/msgbox.hxx>
36cdf0e10cSrcweir #include <svl/svstdarr.hxx>
37cdf0e10cSrcweir #include <svl/eitem.hxx>
38cdf0e10cSrcweir #include <sfx2/viewfrm.hxx>
39cdf0e10cSrcweir #include <sfx2/dispatch.hxx>
40cdf0e10cSrcweir #include <svx/ctredlin.hxx>
41cdf0e10cSrcweir #include <svx/postattr.hxx>
42cdf0e10cSrcweir #include <swtypes.hxx>
43cdf0e10cSrcweir #include <wrtsh.hxx>
44cdf0e10cSrcweir #include <view.hxx>
45cdf0e10cSrcweir #include <swmodule.hxx>
46cdf0e10cSrcweir #ifndef _REDLNDLG_HXX
47cdf0e10cSrcweir #define _REDLNACCEPTDLG
48cdf0e10cSrcweir #include <redlndlg.hxx>
49cdf0e10cSrcweir #endif
50cdf0e10cSrcweir #include <swwait.hxx>
51cdf0e10cSrcweir #include <uitool.hxx>
52cdf0e10cSrcweir 
53cdf0e10cSrcweir #include <helpid.h>
54cdf0e10cSrcweir #include <cmdid.h>
55cdf0e10cSrcweir #include <misc.hrc>
56cdf0e10cSrcweir #include <redlndlg.hrc>
57cdf0e10cSrcweir #include <shells.hrc>
58cdf0e10cSrcweir 
59cdf0e10cSrcweir // -> #111827#
60cdf0e10cSrcweir #include <comcore.hrc>
61cdf0e10cSrcweir #include <swundo.hxx>
62cdf0e10cSrcweir #include <SwRewriter.hxx>
63cdf0e10cSrcweir // <- #111827#
64cdf0e10cSrcweir 
65cdf0e10cSrcweir #include <vector>
66cdf0e10cSrcweir #include <svx/svxdlg.hxx>
67cdf0e10cSrcweir #include <svx/dialogs.hrc>
68cdf0e10cSrcweir 
69cdf0e10cSrcweir #include <unomid.h>
70cdf0e10cSrcweir 
71cdf0e10cSrcweir #include <docsh.hxx>
72cdf0e10cSrcweir 
73cdf0e10cSrcweir #include <IDocumentRedlineAccess.hxx>
74cdf0e10cSrcweir 
75cdf0e10cSrcweir /*------------------------------------------------------------------------
76cdf0e10cSrcweir 	Beschreibung:
77cdf0e10cSrcweir ------------------------------------------------------------------------*/
78cdf0e10cSrcweir 
79cdf0e10cSrcweir SFX_IMPL_MODELESSDIALOG( SwRedlineAcceptChild, FN_REDLINE_ACCEPT )
80cdf0e10cSrcweir 
81cdf0e10cSrcweir SV_IMPL_PTRARR(SwRedlineDataParentArr, SwRedlineDataParentPtr)
82cdf0e10cSrcweir SV_IMPL_OP_PTRARR_SORT(SwRedlineDataParentSortArr, SwRedlineDataParentPtr)
83cdf0e10cSrcweir SV_IMPL_PTRARR(SwRedlineDataChildArr, SwRedlineDataChildPtr)
84cdf0e10cSrcweir SV_IMPL_PTRARR(SvLBoxEntryArr, SvLBoxEntryPtr)
85cdf0e10cSrcweir 
86cdf0e10cSrcweir static sal_uInt16 nSortMode = 0xffff;
87cdf0e10cSrcweir static sal_Bool   bSortDir = sal_True;
88cdf0e10cSrcweir 
89cdf0e10cSrcweir /*------------------------------------------------------------------------
90cdf0e10cSrcweir 	Beschreibung:
91cdf0e10cSrcweir ------------------------------------------------------------------------*/
92cdf0e10cSrcweir 
93cdf0e10cSrcweir SwRedlineAcceptChild::SwRedlineAcceptChild( Window* _pParent,
94cdf0e10cSrcweir 											sal_uInt16 nId,
95cdf0e10cSrcweir 											SfxBindings* pBindings,
96cdf0e10cSrcweir 											SfxChildWinInfo* pInfo ) :
97cdf0e10cSrcweir     SwChildWinWrapper( _pParent, nId )
98cdf0e10cSrcweir {
99cdf0e10cSrcweir     pWindow = new SwModelessRedlineAcceptDlg( pBindings, this, _pParent);
100cdf0e10cSrcweir 
101cdf0e10cSrcweir 	((SwModelessRedlineAcceptDlg *)pWindow)->Initialize(pInfo);
102cdf0e10cSrcweir }
103cdf0e10cSrcweir 
104cdf0e10cSrcweir /*--------------------------------------------------------------------
105cdf0e10cSrcweir 	Beschreibung: Nach Dok-Wechsel Dialog neu initialisieren
106cdf0e10cSrcweir  --------------------------------------------------------------------*/
107cdf0e10cSrcweir 
108cdf0e10cSrcweir sal_Bool SwRedlineAcceptChild::ReInitDlg(SwDocShell *pDocSh)
109cdf0e10cSrcweir {
110cdf0e10cSrcweir 	sal_Bool bRet;
111cdf0e10cSrcweir 
112cdf0e10cSrcweir 	if ((bRet = SwChildWinWrapper::ReInitDlg(pDocSh)) == sal_True)	// Sofort aktualisieren, Dok-Wechsel
113cdf0e10cSrcweir 		((SwModelessRedlineAcceptDlg*)GetWindow())->Activate();
114cdf0e10cSrcweir 
115cdf0e10cSrcweir 	return bRet;
116cdf0e10cSrcweir }
117cdf0e10cSrcweir 
118cdf0e10cSrcweir /*------------------------------------------------------------------------
119cdf0e10cSrcweir 	Beschreibung:
120cdf0e10cSrcweir ------------------------------------------------------------------------*/
121cdf0e10cSrcweir 
122cdf0e10cSrcweir SwModelessRedlineAcceptDlg::SwModelessRedlineAcceptDlg( SfxBindings* _pBindings,
123cdf0e10cSrcweir 														SwChildWinWrapper* pChild,
124cdf0e10cSrcweir                                                         Window *_pParent) :
125cdf0e10cSrcweir     SfxModelessDialog(_pBindings, pChild, _pParent, SW_RES(DLG_REDLINE_ACCEPT)),
126cdf0e10cSrcweir 	pChildWin		(pChild)
127cdf0e10cSrcweir {
128cdf0e10cSrcweir 	pImplDlg = new SwRedlineAcceptDlg(this);
129cdf0e10cSrcweir 
130cdf0e10cSrcweir 	FreeResource();
131cdf0e10cSrcweir }
132cdf0e10cSrcweir 
133cdf0e10cSrcweir /*--------------------------------------------------------------------
134cdf0e10cSrcweir 	Beschreibung:
135cdf0e10cSrcweir  --------------------------------------------------------------------*/
136cdf0e10cSrcweir 
137cdf0e10cSrcweir void SwModelessRedlineAcceptDlg::Activate()
138cdf0e10cSrcweir {
139cdf0e10cSrcweir 	SwView *pView = ::GetActiveView();
140cdf0e10cSrcweir 
141cdf0e10cSrcweir 	if (!pView)	// Kann passieren, wenn man auf eine andere App umschaltet, wenn
142cdf0e10cSrcweir 		return;	// vorher eine Listbox im Dialog den Focus hatte (eigentlich THs Bug)
143cdf0e10cSrcweir 
144cdf0e10cSrcweir 	SwDocShell *pDocSh = pView->GetDocShell();
145cdf0e10cSrcweir 
146cdf0e10cSrcweir 	if (pChildWin->GetOldDocShell() != pDocSh)
147cdf0e10cSrcweir 	{	// Dok-Wechsel
148cdf0e10cSrcweir 		SwWait aWait( *pDocSh, sal_False );
149cdf0e10cSrcweir 		SwWrtShell* pSh = pView->GetWrtShellPtr();
150cdf0e10cSrcweir 
151cdf0e10cSrcweir 		pChildWin->SetOldDocShell(pDocSh);	// Rekursion vermeiden (durch Modified-Hdl)
152cdf0e10cSrcweir 
153cdf0e10cSrcweir 		sal_Bool bMod = pSh->IsModified();
154cdf0e10cSrcweir 		SfxBoolItem aShow(FN_REDLINE_SHOW, sal_True);
155cdf0e10cSrcweir 		pSh->GetView().GetViewFrame()->GetDispatcher()->Execute(
156cdf0e10cSrcweir 			FN_REDLINE_SHOW, SFX_CALLMODE_SYNCHRON|SFX_CALLMODE_RECORD, &aShow, 0L);
157cdf0e10cSrcweir 		if (!bMod)
158cdf0e10cSrcweir 			pSh->ResetModified();
159cdf0e10cSrcweir 		pImplDlg->Init();
160cdf0e10cSrcweir 
161cdf0e10cSrcweir 		return;
162cdf0e10cSrcweir 	}
163cdf0e10cSrcweir 
164cdf0e10cSrcweir 	pImplDlg->Activate();
165cdf0e10cSrcweir }
166cdf0e10cSrcweir 
167cdf0e10cSrcweir /*--------------------------------------------------------------------
168cdf0e10cSrcweir 	Beschreibung:
169cdf0e10cSrcweir  --------------------------------------------------------------------*/
170cdf0e10cSrcweir 
171cdf0e10cSrcweir void SwModelessRedlineAcceptDlg::Initialize(SfxChildWinInfo *pInfo)
172cdf0e10cSrcweir {
173cdf0e10cSrcweir 	String aStr;
174cdf0e10cSrcweir 	if (pInfo != NULL)
175cdf0e10cSrcweir 		pImplDlg->Initialize(pInfo->aExtraString);
176cdf0e10cSrcweir 
177cdf0e10cSrcweir 	SfxModelessDialog::Initialize(pInfo);
178cdf0e10cSrcweir }
179cdf0e10cSrcweir 
180cdf0e10cSrcweir /*--------------------------------------------------------------------
181cdf0e10cSrcweir 	Beschreibung:
182cdf0e10cSrcweir  --------------------------------------------------------------------*/
183cdf0e10cSrcweir 
184cdf0e10cSrcweir void SwModelessRedlineAcceptDlg::FillInfo(SfxChildWinInfo& rInfo) const
185cdf0e10cSrcweir {
186cdf0e10cSrcweir 	SfxModelessDialog::FillInfo(rInfo);
187cdf0e10cSrcweir 	pImplDlg->FillInfo(rInfo.aExtraString);
188cdf0e10cSrcweir }
189cdf0e10cSrcweir 
190cdf0e10cSrcweir /*------------------------------------------------------------------------
191cdf0e10cSrcweir 	Beschreibung:
192cdf0e10cSrcweir ------------------------------------------------------------------------*/
193cdf0e10cSrcweir 
194cdf0e10cSrcweir void SwModelessRedlineAcceptDlg::Resize()
195cdf0e10cSrcweir {
196cdf0e10cSrcweir 	pImplDlg->Resize();
197cdf0e10cSrcweir 	SfxModelessDialog::Resize();
198cdf0e10cSrcweir }
199cdf0e10cSrcweir 
200cdf0e10cSrcweir /*------------------------------------------------------------------------
201cdf0e10cSrcweir 	Beschreibung:
202cdf0e10cSrcweir ------------------------------------------------------------------------*/
203cdf0e10cSrcweir 
204cdf0e10cSrcweir SwModelessRedlineAcceptDlg::~SwModelessRedlineAcceptDlg()
205cdf0e10cSrcweir {
206cdf0e10cSrcweir 	delete pImplDlg;
207cdf0e10cSrcweir }
208cdf0e10cSrcweir 
209cdf0e10cSrcweir /*------------------------------------------------------------------------
210cdf0e10cSrcweir 	Beschreibung:
211cdf0e10cSrcweir ------------------------------------------------------------------------*/
212cdf0e10cSrcweir 
213cdf0e10cSrcweir SwRedlineAcceptDlg::SwRedlineAcceptDlg(Dialog *pParent, sal_Bool bAutoFmt) :
214cdf0e10cSrcweir 	pParentDlg		(pParent),
215cdf0e10cSrcweir     aTabPagesCTRL   (pParent, SW_RES(CTRL_TABPAGES)),
216cdf0e10cSrcweir     aPopup          (SW_RES(MN_REDLINE_POPUP)),
217cdf0e10cSrcweir     sInserted       (SW_RES(STR_REDLINE_INSERTED)),
218cdf0e10cSrcweir     sDeleted        (SW_RES(STR_REDLINE_DELETED)),
219cdf0e10cSrcweir     sFormated       (SW_RES(STR_REDLINE_FORMATED)),
220cdf0e10cSrcweir     sTableChgd      (SW_RES(STR_REDLINE_TABLECHG)),
221cdf0e10cSrcweir     sFmtCollSet     (SW_RES(STR_REDLINE_FMTCOLLSET)),
222cdf0e10cSrcweir     sAutoFormat     (SW_RES(STR_REDLINE_AUTOFMT)),
223cdf0e10cSrcweir 	bOnlyFormatedRedlines( sal_False ),
224cdf0e10cSrcweir 	bHasReadonlySel	( sal_False ),
225cdf0e10cSrcweir 	bRedlnAutoFmt	(bAutoFmt),
226cdf0e10cSrcweir     bInhibitActivate( false )
227cdf0e10cSrcweir {
228cdf0e10cSrcweir 	aTabPagesCTRL.SetHelpId(HID_REDLINE_CTRL);
229cdf0e10cSrcweir 	pTPView = aTabPagesCTRL.GetViewPage();
230cdf0e10cSrcweir 	pTable = pTPView->GetTableControl();
231cdf0e10cSrcweir 
232cdf0e10cSrcweir 	pTPView->InsertWriterHeader();
233cdf0e10cSrcweir 	pTPView->SetAcceptClickHdl(LINK(this, SwRedlineAcceptDlg, AcceptHdl));
234cdf0e10cSrcweir 	pTPView->SetAcceptAllClickHdl(LINK(this, SwRedlineAcceptDlg, AcceptAllHdl));
235cdf0e10cSrcweir 	pTPView->SetRejectClickHdl(LINK(this, SwRedlineAcceptDlg, RejectHdl));
236cdf0e10cSrcweir 	pTPView->SetRejectAllClickHdl(LINK(this, SwRedlineAcceptDlg, RejectAllHdl));
237cdf0e10cSrcweir 	pTPView->SetUndoClickHdl(LINK(this, SwRedlineAcceptDlg, UndoHdl));
238cdf0e10cSrcweir 
239cdf0e10cSrcweir 	aTabPagesCTRL.GetFilterPage()->SetReadyHdl(LINK(this, SwRedlineAcceptDlg, FilterChangedHdl));
240cdf0e10cSrcweir 
241cdf0e10cSrcweir 	ListBox *pActLB = aTabPagesCTRL.GetFilterPage()->GetLbAction();
242cdf0e10cSrcweir 	pActLB->InsertEntry(sInserted);
243cdf0e10cSrcweir 	pActLB->InsertEntry(sDeleted);
244cdf0e10cSrcweir 	pActLB->InsertEntry(sFormated);
245cdf0e10cSrcweir 	pActLB->InsertEntry(sTableChgd);
246cdf0e10cSrcweir 
247cdf0e10cSrcweir 	if (HasRedlineAutoFmt())
248cdf0e10cSrcweir 	{
249cdf0e10cSrcweir 		pActLB->InsertEntry(sFmtCollSet);
250cdf0e10cSrcweir 		pActLB->InsertEntry(sAutoFormat);
251cdf0e10cSrcweir 		pTPView->ShowUndo(sal_True);
252cdf0e10cSrcweir 		pTPView->DisableUndo();		// Noch gibts keine UNDO-Events
253cdf0e10cSrcweir 	}
254cdf0e10cSrcweir 
255cdf0e10cSrcweir 	pActLB->SelectEntryPos(0);
256cdf0e10cSrcweir 
257cdf0e10cSrcweir 	pTable->SetStyle(pTable->GetStyle()|WB_HASLINES|WB_CLIPCHILDREN|WB_HASBUTTONS|WB_HASBUTTONSATROOT|WB_HSCROLL);
258cdf0e10cSrcweir 	pTable->SetNodeDefaultImages();
259cdf0e10cSrcweir 	pTable->SetSelectionMode(MULTIPLE_SELECTION);
260cdf0e10cSrcweir 	pTable->SetHighlightRange(1);
261cdf0e10cSrcweir 
262cdf0e10cSrcweir 	static long aStaticTabs[]=
263cdf0e10cSrcweir 	{
264cdf0e10cSrcweir 		4,10,70,120,170
265cdf0e10cSrcweir 	};
266cdf0e10cSrcweir 
267cdf0e10cSrcweir 	pTable->SetTabs(aStaticTabs);
268cdf0e10cSrcweir 
269cdf0e10cSrcweir 	// Minimalgroesse setzen
270cdf0e10cSrcweir 	Size aMinSz(aTabPagesCTRL.GetMinSizePixel());
271cdf0e10cSrcweir 	Point aPos(aTabPagesCTRL.GetPosPixel());
272cdf0e10cSrcweir 
273cdf0e10cSrcweir 	aMinSz.Width() += (aPos.X() * 2 - 1);
274cdf0e10cSrcweir 	aMinSz.Height() += (aPos.Y() * 2 - 1);
275cdf0e10cSrcweir 	pParentDlg->SetMinOutputSizePixel(aMinSz);
276cdf0e10cSrcweir 
277cdf0e10cSrcweir 	if (pParentDlg->GetOutputSizePixel().Width() < aMinSz.Width())
278cdf0e10cSrcweir 		pParentDlg->SetOutputSizePixel(Size(aMinSz.Width(), pParentDlg->GetOutputSizePixel().Height()));
279cdf0e10cSrcweir 	if (pParentDlg->GetOutputSizePixel().Height() < aMinSz.Height())
280cdf0e10cSrcweir 		pParentDlg->SetOutputSizePixel(Size(pParentDlg->GetOutputSizePixel().Width(), aMinSz.Height()));
281cdf0e10cSrcweir 
282cdf0e10cSrcweir 	pTable->SortByCol(nSortMode, bSortDir);
283cdf0e10cSrcweir 
284cdf0e10cSrcweir 	aOldSelectHdl = pTable->GetSelectHdl();
285cdf0e10cSrcweir 	aOldDeselectHdl = pTable->GetDeselectHdl();
286cdf0e10cSrcweir 	pTable->SetSelectHdl(LINK(this, SwRedlineAcceptDlg, SelectHdl));
287cdf0e10cSrcweir 	pTable->SetDeselectHdl(LINK(this, SwRedlineAcceptDlg, DeselectHdl));
288cdf0e10cSrcweir 	pTable->SetCommandHdl(LINK(this, SwRedlineAcceptDlg, CommandHdl));
289cdf0e10cSrcweir 
290cdf0e10cSrcweir 	// Flackern der Buttons vermeiden:
291cdf0e10cSrcweir 	aDeselectTimer.SetTimeout(100);
292cdf0e10cSrcweir 	aDeselectTimer.SetTimeoutHdl(LINK(this, SwRedlineAcceptDlg, SelectHdl));
293cdf0e10cSrcweir 
294cdf0e10cSrcweir 	// Mehrfachselektion der selben Texte vermeiden:
295cdf0e10cSrcweir 	aSelectTimer.SetTimeout(100);
296cdf0e10cSrcweir 	aSelectTimer.SetTimeoutHdl(LINK(this, SwRedlineAcceptDlg, GotoHdl));
297cdf0e10cSrcweir }
298cdf0e10cSrcweir 
299cdf0e10cSrcweir /*------------------------------------------------------------------------
300cdf0e10cSrcweir 	Beschreibung:
301cdf0e10cSrcweir ------------------------------------------------------------------------*/
302cdf0e10cSrcweir 
303cdf0e10cSrcweir SwRedlineAcceptDlg::~SwRedlineAcceptDlg()
304cdf0e10cSrcweir {
305cdf0e10cSrcweir }
306cdf0e10cSrcweir 
307cdf0e10cSrcweir /*------------------------------------------------------------------------
308cdf0e10cSrcweir 	Beschreibung:
309cdf0e10cSrcweir ------------------------------------------------------------------------*/
310cdf0e10cSrcweir 
311cdf0e10cSrcweir void SwRedlineAcceptDlg::Init(sal_uInt16 nStart)
312cdf0e10cSrcweir {
313cdf0e10cSrcweir 	SwWait aWait( *::GetActiveView()->GetDocShell(), sal_False );
314cdf0e10cSrcweir 	pTable->SetUpdateMode(sal_False);
315cdf0e10cSrcweir 	aUsedSeqNo.Remove((sal_uInt16)0, aUsedSeqNo.Count());
316cdf0e10cSrcweir 
317cdf0e10cSrcweir 	if (nStart)
318cdf0e10cSrcweir 		RemoveParents(nStart, aRedlineParents.Count() - 1);
319cdf0e10cSrcweir 	else
320cdf0e10cSrcweir 	{
321cdf0e10cSrcweir 		pTable->Clear();
322cdf0e10cSrcweir 		aRedlineChilds.DeleteAndDestroy(0, aRedlineChilds.Count());
323cdf0e10cSrcweir 		aRedlineParents.DeleteAndDestroy(nStart, aRedlineParents.Count() - nStart);
324cdf0e10cSrcweir 	}
325cdf0e10cSrcweir 
326cdf0e10cSrcweir 	// Parents einfuegen
327cdf0e10cSrcweir 	InsertParents(nStart);
328cdf0e10cSrcweir 	InitAuthors();
329cdf0e10cSrcweir 
330cdf0e10cSrcweir 	pTable->SetUpdateMode(sal_True);
331cdf0e10cSrcweir     // #i69618# this moves the list box to the right position, visually
332cdf0e10cSrcweir     SvLBoxEntry* pSelEntry = pTable->FirstSelected();
333cdf0e10cSrcweir     if( pSelEntry )
334cdf0e10cSrcweir         pTable->MakeVisible( pSelEntry, sal_True ); //#i70937#, force the scroll
335cdf0e10cSrcweir }
336cdf0e10cSrcweir 
337cdf0e10cSrcweir /*------------------------------------------------------------------------
338cdf0e10cSrcweir 	Beschreibung:
339cdf0e10cSrcweir ------------------------------------------------------------------------*/
340cdf0e10cSrcweir 
341cdf0e10cSrcweir void SwRedlineAcceptDlg::InitAuthors()
342cdf0e10cSrcweir {
343cdf0e10cSrcweir 	SwWrtShell* pSh = ::GetActiveView()->GetWrtShellPtr();
344cdf0e10cSrcweir 
345cdf0e10cSrcweir 	SvxTPFilter *pFilterPage = aTabPagesCTRL.GetFilterPage();
346cdf0e10cSrcweir 
347cdf0e10cSrcweir 	String sAuthor;
348cdf0e10cSrcweir 	SvStringsSortDtor aStrings;
349cdf0e10cSrcweir 	String sOldAuthor(pFilterPage->GetSelectedAuthor());
350cdf0e10cSrcweir 	pFilterPage->ClearAuthors();
351cdf0e10cSrcweir 
352cdf0e10cSrcweir 	String sParent;
353cdf0e10cSrcweir 	sal_uInt16 nCount = pSh->GetRedlineCount();
354cdf0e10cSrcweir 
355cdf0e10cSrcweir 	bOnlyFormatedRedlines = sal_True;
356cdf0e10cSrcweir 	bHasReadonlySel = sal_False;
357cdf0e10cSrcweir 	sal_Bool bIsNotFormated = sal_False;
358cdf0e10cSrcweir 	sal_uInt16 i;
359cdf0e10cSrcweir 
360cdf0e10cSrcweir 	// Autoren ermitteln
361cdf0e10cSrcweir 	for ( i = 0; i < nCount; i++)
362cdf0e10cSrcweir 	{
363cdf0e10cSrcweir 		const SwRedline& rRedln = pSh->GetRedline(i);
364cdf0e10cSrcweir 
365cdf0e10cSrcweir 		if( bOnlyFormatedRedlines && nsRedlineType_t::REDLINE_FORMAT != rRedln.GetType() )
366cdf0e10cSrcweir 			bOnlyFormatedRedlines = sal_False;
367cdf0e10cSrcweir 
368cdf0e10cSrcweir //JP 27.9.2001: make no sense if we handle readonly sections
369cdf0e10cSrcweir //		if( !bHasReadonlySel && rRedln.HasReadonlySel() )
370cdf0e10cSrcweir //			bHasReadonlySel = sal_True;
371cdf0e10cSrcweir 
372cdf0e10cSrcweir 		String *pAuthor = new String(rRedln.GetAuthorString());
373cdf0e10cSrcweir 		if (!aStrings.Insert(pAuthor))
374cdf0e10cSrcweir 			delete pAuthor;
375cdf0e10cSrcweir 
376cdf0e10cSrcweir 		for (sal_uInt16 nStack = 1; nStack < rRedln.GetStackCount(); nStack++)
377cdf0e10cSrcweir 		{
378cdf0e10cSrcweir 			pAuthor = new String(rRedln.GetAuthorString(nStack));
379cdf0e10cSrcweir 			if (!aStrings.Insert(pAuthor))
380cdf0e10cSrcweir 				delete pAuthor;
381cdf0e10cSrcweir 		}
382cdf0e10cSrcweir 	}
383cdf0e10cSrcweir 
384cdf0e10cSrcweir 	for (i = 0; i < aStrings.Count(); i++)
385cdf0e10cSrcweir 		pFilterPage->InsertAuthor(*aStrings[i]);
386cdf0e10cSrcweir 
387cdf0e10cSrcweir 	if (pFilterPage->SelectAuthor(sOldAuthor) == LISTBOX_ENTRY_NOTFOUND && aStrings.Count())
388cdf0e10cSrcweir 		pFilterPage->SelectAuthor(*aStrings[0]);
389cdf0e10cSrcweir 
390cdf0e10cSrcweir     sal_Bool bEnable = pTable->GetEntryCount() != 0 && !pSh->getIDocumentRedlineAccess()->GetRedlinePassword().getLength();
391cdf0e10cSrcweir 	sal_Bool bSel = pTable->FirstSelected() != 0;
392cdf0e10cSrcweir 
393cdf0e10cSrcweir 	SvLBoxEntry* pSelEntry = pTable->FirstSelected();
394cdf0e10cSrcweir 	while (pSelEntry)
395cdf0e10cSrcweir 	{
396cdf0e10cSrcweir 		sal_uInt16 nPos = GetRedlinePos(*pSelEntry);
397cdf0e10cSrcweir 		const SwRedline& rRedln = pSh->GetRedline( nPos );
398cdf0e10cSrcweir 
399cdf0e10cSrcweir 		bIsNotFormated |= nsRedlineType_t::REDLINE_FORMAT != rRedln.GetType();
400cdf0e10cSrcweir 		pSelEntry = pTable->NextSelected(pSelEntry);
401cdf0e10cSrcweir 	}
402cdf0e10cSrcweir 
403cdf0e10cSrcweir 	pTPView->EnableAccept( bEnable && bSel );
404cdf0e10cSrcweir 	pTPView->EnableReject( bEnable && bIsNotFormated && bSel );
405cdf0e10cSrcweir 	pTPView->EnableAcceptAll( bEnable && !bHasReadonlySel );
406cdf0e10cSrcweir 	pTPView->EnableRejectAll( bEnable && !bHasReadonlySel &&
407cdf0e10cSrcweir 								!bOnlyFormatedRedlines );
408cdf0e10cSrcweir }
409cdf0e10cSrcweir 
410cdf0e10cSrcweir /*------------------------------------------------------------------------
411cdf0e10cSrcweir 	Beschreibung:
412cdf0e10cSrcweir ------------------------------------------------------------------------*/
413cdf0e10cSrcweir 
414cdf0e10cSrcweir String SwRedlineAcceptDlg::GetRedlineText( const SwRedline& rRedln,
415cdf0e10cSrcweir 										DateTime &rDateTime, sal_uInt16 nStack)
416cdf0e10cSrcweir {
417cdf0e10cSrcweir 	String sEntry(GetActionText(rRedln, nStack));
418cdf0e10cSrcweir 	sEntry += '\t';
419cdf0e10cSrcweir 	sEntry += rRedln.GetAuthorString(nStack);
420cdf0e10cSrcweir 	sEntry += '\t';
421cdf0e10cSrcweir 
422cdf0e10cSrcweir 	const DateTime &rDT = rRedln.GetTimeStamp(nStack);
423cdf0e10cSrcweir 	rDateTime = rDT;
424cdf0e10cSrcweir 
425cdf0e10cSrcweir 	sEntry += GetAppLangDateTimeString( rDT );
426cdf0e10cSrcweir 	sEntry += '\t';
427cdf0e10cSrcweir 
428cdf0e10cSrcweir 	sEntry += rRedln.GetComment(nStack);
429cdf0e10cSrcweir 
430cdf0e10cSrcweir 	return sEntry;
431cdf0e10cSrcweir }
432cdf0e10cSrcweir 
433cdf0e10cSrcweir /*------------------------------------------------------------------------
434cdf0e10cSrcweir 	Beschreibung:
435cdf0e10cSrcweir ------------------------------------------------------------------------*/
436cdf0e10cSrcweir 
437cdf0e10cSrcweir const String &SwRedlineAcceptDlg::GetActionText(const SwRedline& rRedln, sal_uInt16 nStack)
438cdf0e10cSrcweir {
439cdf0e10cSrcweir 	switch( rRedln.GetType(nStack) )
440cdf0e10cSrcweir 	{
441cdf0e10cSrcweir 		case nsRedlineType_t::REDLINE_INSERT:	return sInserted;
442cdf0e10cSrcweir 		case nsRedlineType_t::REDLINE_DELETE:	return sDeleted;
443cdf0e10cSrcweir 		case nsRedlineType_t::REDLINE_FORMAT:	return sFormated;
444cdf0e10cSrcweir 		case nsRedlineType_t::REDLINE_TABLE: 	return sTableChgd;
445cdf0e10cSrcweir 		case nsRedlineType_t::REDLINE_FMTCOLL: 	return sFmtCollSet;
446cdf0e10cSrcweir         default:;//prevent warning
447cdf0e10cSrcweir 	}
448cdf0e10cSrcweir 
449cdf0e10cSrcweir 	return aEmptyStr;
450cdf0e10cSrcweir }
451cdf0e10cSrcweir 
452cdf0e10cSrcweir /*------------------------------------------------------------------------
453cdf0e10cSrcweir 	Beschreibung:
454cdf0e10cSrcweir ------------------------------------------------------------------------*/
455cdf0e10cSrcweir 
456cdf0e10cSrcweir void SwRedlineAcceptDlg::Resize()
457cdf0e10cSrcweir {
458cdf0e10cSrcweir 	Size aSz(pParentDlg->GetOutputSizePixel());
459cdf0e10cSrcweir 
460cdf0e10cSrcweir 	Point aPos(aTabPagesCTRL.GetPosPixel());
461cdf0e10cSrcweir 
462cdf0e10cSrcweir 	aSz.Width() -= (aPos.X() * 2 - 1);
463cdf0e10cSrcweir 	aSz.Height() -= (aPos.Y() * 2 - 1);
464cdf0e10cSrcweir 
465cdf0e10cSrcweir 	aTabPagesCTRL.SetOutputSizePixel(aSz);
466cdf0e10cSrcweir }
467cdf0e10cSrcweir 
468cdf0e10cSrcweir /*--------------------------------------------------------------------
469cdf0e10cSrcweir 	Beschreibung: Nach Aktivierung neu initialisieren
470cdf0e10cSrcweir  --------------------------------------------------------------------*/
471cdf0e10cSrcweir 
472cdf0e10cSrcweir void SwRedlineAcceptDlg::Activate()
473cdf0e10cSrcweir {
474cdf0e10cSrcweir     // prevent update if flag is set (#102547#)
475cdf0e10cSrcweir     if( bInhibitActivate )
476cdf0e10cSrcweir         return;
477cdf0e10cSrcweir 
478cdf0e10cSrcweir 	SwView *pView = ::GetActiveView();
479cdf0e10cSrcweir 	SwWait aWait( *pView->GetDocShell(), sal_False );
480cdf0e10cSrcweir 
481cdf0e10cSrcweir 	aUsedSeqNo.Remove((sal_uInt16)0, aUsedSeqNo.Count());
482cdf0e10cSrcweir 
483cdf0e10cSrcweir 	if (!pView)	// Kann passieren, wenn man auf eine andere App umschaltet, wenn
484cdf0e10cSrcweir 		return;	// vorher eine Listbox im Dialog den Focus hatte (eigentlich THs Bug)
485cdf0e10cSrcweir 
486cdf0e10cSrcweir /*	if (HasRedlineAutoFmt())
487cdf0e10cSrcweir 	{
488cdf0e10cSrcweir 		Init();
489cdf0e10cSrcweir 		return;
490cdf0e10cSrcweir 	}*/
491cdf0e10cSrcweir 
492cdf0e10cSrcweir 	// Hat sich was geaendert?
493cdf0e10cSrcweir 	SwWrtShell* pSh = pView->GetWrtShellPtr();
494cdf0e10cSrcweir 	sal_uInt16 nCount = pSh->GetRedlineCount();
495cdf0e10cSrcweir 
496cdf0e10cSrcweir 	// Anzahl und Pointer ueberpruefen
497cdf0e10cSrcweir 	SwRedlineDataParent *pParent = 0;
498cdf0e10cSrcweir 	sal_uInt16 i;
499cdf0e10cSrcweir 
500cdf0e10cSrcweir 	for ( i = 0; i < nCount; i++)
501cdf0e10cSrcweir 	{
502cdf0e10cSrcweir 		const SwRedline& rRedln = pSh->GetRedline(i);
503cdf0e10cSrcweir 
504cdf0e10cSrcweir 		if (i >= aRedlineParents.Count())
505cdf0e10cSrcweir 		{
506cdf0e10cSrcweir 			// Neue Eintraege wurden angehaengt
507cdf0e10cSrcweir 			Init(i);
508cdf0e10cSrcweir 			return;
509cdf0e10cSrcweir 		}
510cdf0e10cSrcweir 
511cdf0e10cSrcweir 		pParent = aRedlineParents[i];
512cdf0e10cSrcweir 		if (&rRedln.GetRedlineData() != pParent->pData)
513cdf0e10cSrcweir 		{
514cdf0e10cSrcweir 			// Redline-Parents wurden eingefuegt, geaendert oder geloescht
515cdf0e10cSrcweir 			if ((i = CalcDiff(i, sal_False)) == USHRT_MAX)
516cdf0e10cSrcweir 				return;
517cdf0e10cSrcweir 			continue;
518cdf0e10cSrcweir 		}
519cdf0e10cSrcweir 
520cdf0e10cSrcweir 		const SwRedlineData *pRedlineData = rRedln.GetRedlineData().Next();
521cdf0e10cSrcweir 		const SwRedlineDataChild *pBackupData = pParent->pNext;
522cdf0e10cSrcweir 
523cdf0e10cSrcweir 		if (!pRedlineData && pBackupData)
524cdf0e10cSrcweir 		{
525cdf0e10cSrcweir 			// Redline-Childs wurden geloescht
526cdf0e10cSrcweir 			if ((i = CalcDiff(i, sal_True)) == USHRT_MAX)
527cdf0e10cSrcweir 				return;
528cdf0e10cSrcweir 			continue;
529cdf0e10cSrcweir 		}
530cdf0e10cSrcweir 		else
531cdf0e10cSrcweir 		{
532cdf0e10cSrcweir 			while (pRedlineData)
533cdf0e10cSrcweir 			{
534cdf0e10cSrcweir 				if (pRedlineData != pBackupData->pChild)
535cdf0e10cSrcweir 				{
536cdf0e10cSrcweir 					// Redline-Childs wurden eingefuegt, geaendert oder geloescht
537cdf0e10cSrcweir 					if ((i = CalcDiff(i, sal_True)) == USHRT_MAX)
538cdf0e10cSrcweir 						return;
539cdf0e10cSrcweir 					continue;
540cdf0e10cSrcweir 				}
541cdf0e10cSrcweir 				if (pBackupData)
542cdf0e10cSrcweir 					pBackupData = pBackupData->pNext;
543cdf0e10cSrcweir 				pRedlineData = pRedlineData->Next();
544cdf0e10cSrcweir 			}
545cdf0e10cSrcweir 		}
546cdf0e10cSrcweir 	}
547cdf0e10cSrcweir 
548cdf0e10cSrcweir 	if (nCount != aRedlineParents.Count())
549cdf0e10cSrcweir 	{
550cdf0e10cSrcweir 		// Redlines wurden am Ende geloescht
551cdf0e10cSrcweir 		Init(nCount);
552cdf0e10cSrcweir 		return;
553cdf0e10cSrcweir 	}
554cdf0e10cSrcweir 
555cdf0e10cSrcweir 	// Kommentar ueberpruefen
556cdf0e10cSrcweir 	for (i = 0; i < nCount; i++)
557cdf0e10cSrcweir 	{
558cdf0e10cSrcweir 		const SwRedline& rRedln = pSh->GetRedline(i);
559cdf0e10cSrcweir 		pParent = aRedlineParents[i];
560cdf0e10cSrcweir 
561cdf0e10cSrcweir 		if(!rRedln.GetComment().Equals(pParent->sComment))
562cdf0e10cSrcweir 		{
563cdf0e10cSrcweir 			if (pParent->pTLBParent)
564cdf0e10cSrcweir 			{
565cdf0e10cSrcweir 				// Nur Kommentar aktualisieren
566cdf0e10cSrcweir 				String sComment(rRedln.GetComment());
567cdf0e10cSrcweir 				sComment.SearchAndReplaceAll((sal_Unicode)_LF,(sal_Unicode)' ');
568cdf0e10cSrcweir 				pTable->SetEntryText(sComment, pParent->pTLBParent, 3);
569cdf0e10cSrcweir 			}
570cdf0e10cSrcweir 			pParent->sComment = rRedln.GetComment();
571cdf0e10cSrcweir 		}
572cdf0e10cSrcweir 	}
573cdf0e10cSrcweir 
574cdf0e10cSrcweir 	InitAuthors();
575cdf0e10cSrcweir }
576cdf0e10cSrcweir 
577cdf0e10cSrcweir /* -----------------05.06.98 13:06-------------------
578cdf0e10cSrcweir  *
579cdf0e10cSrcweir  * --------------------------------------------------*/
580cdf0e10cSrcweir 
581cdf0e10cSrcweir sal_uInt16 SwRedlineAcceptDlg::CalcDiff(sal_uInt16 nStart, sal_Bool bChild)
582cdf0e10cSrcweir {
583cdf0e10cSrcweir 	if (!nStart)
584cdf0e10cSrcweir 	{
585cdf0e10cSrcweir 		Init();
586cdf0e10cSrcweir 		return USHRT_MAX;
587cdf0e10cSrcweir 	}
588cdf0e10cSrcweir 
589cdf0e10cSrcweir 	pTable->SetUpdateMode(sal_False);
590cdf0e10cSrcweir 	SwView *pView	= ::GetActiveView();
591cdf0e10cSrcweir 	SwWrtShell* pSh	= pView->GetWrtShellPtr();
592cdf0e10cSrcweir     sal_uInt16 nAutoFmt = HasRedlineAutoFmt() ? nsRedlineType_t::REDLINE_FORM_AUTOFMT : 0;
593cdf0e10cSrcweir     SwRedlineDataParent *pParent = aRedlineParents[nStart];
594cdf0e10cSrcweir 	const SwRedline& rRedln = pSh->GetRedline(nStart);
595cdf0e10cSrcweir 
596cdf0e10cSrcweir 	if (bChild)		// Sollte eigentlich nie vorkommen, aber sicher ist sicher...
597cdf0e10cSrcweir 	{
598cdf0e10cSrcweir 		// Alle Childs des Eintrags wegwerfen und neu initialisieren
599cdf0e10cSrcweir 		SwRedlineDataChildPtr pBackupData = (SwRedlineDataChildPtr)pParent->pNext;
600cdf0e10cSrcweir 		SwRedlineDataChildPtr pNext;
601cdf0e10cSrcweir 
602cdf0e10cSrcweir 		while (pBackupData)
603cdf0e10cSrcweir 		{
604cdf0e10cSrcweir 			pNext = (SwRedlineDataChildPtr)pBackupData->pNext;
605cdf0e10cSrcweir 			if (pBackupData->pTLBChild)
606cdf0e10cSrcweir                 pTable->RemoveEntry(pBackupData->pTLBChild);
607cdf0e10cSrcweir 
608cdf0e10cSrcweir 			aRedlineChilds.DeleteAndDestroy(aRedlineChilds.GetPos(pBackupData), 1);
609cdf0e10cSrcweir 			pBackupData = pNext;
610cdf0e10cSrcweir 		}
611cdf0e10cSrcweir 		pParent->pNext = 0;
612cdf0e10cSrcweir 
613cdf0e10cSrcweir 		// Neue Childs einfuegen
614cdf0e10cSrcweir 		InsertChilds(pParent, rRedln, nAutoFmt);
615cdf0e10cSrcweir 
616cdf0e10cSrcweir 		pTable->SetUpdateMode(sal_True);
617cdf0e10cSrcweir 		return nStart;
618cdf0e10cSrcweir 	}
619cdf0e10cSrcweir 
620cdf0e10cSrcweir 	// Wurden Eintraege geloescht?
621cdf0e10cSrcweir 	const SwRedlineData *pRedlineData = &rRedln.GetRedlineData();
622cdf0e10cSrcweir 	sal_uInt16 i;
623cdf0e10cSrcweir 	for ( i = nStart + 1; i < aRedlineParents.Count(); i++)
624cdf0e10cSrcweir 	{
625cdf0e10cSrcweir 		if (aRedlineParents[i]->pData == pRedlineData)
626cdf0e10cSrcweir 		{
627cdf0e10cSrcweir 			// Eintraege von nStart bis i-1 entfernen
628cdf0e10cSrcweir 			RemoveParents(nStart, i - 1);
629cdf0e10cSrcweir 			pTable->SetUpdateMode(sal_True);
630cdf0e10cSrcweir 			return nStart - 1;
631cdf0e10cSrcweir 		}
632cdf0e10cSrcweir 	}
633cdf0e10cSrcweir 
634cdf0e10cSrcweir 	// Wurden Eintraege eingefuegt?
635cdf0e10cSrcweir 	sal_uInt16 nCount = pSh->GetRedlineCount();
636cdf0e10cSrcweir 	pRedlineData = aRedlineParents[nStart]->pData;
637cdf0e10cSrcweir 
638cdf0e10cSrcweir 	for (i = nStart + 1; i < nCount; i++)
639cdf0e10cSrcweir 	{
640cdf0e10cSrcweir 		if (&pSh->GetRedline(i).GetRedlineData() == pRedlineData)
641cdf0e10cSrcweir 		{
642cdf0e10cSrcweir 			// Eintraege von nStart bis i-1 einfuegen
643cdf0e10cSrcweir 			InsertParents(nStart, i - 1);
644cdf0e10cSrcweir 			pTable->SetUpdateMode(sal_True);
645cdf0e10cSrcweir 			return nStart - 1;
646cdf0e10cSrcweir 		}
647cdf0e10cSrcweir 	}
648cdf0e10cSrcweir 
649cdf0e10cSrcweir 	pTable->SetUpdateMode(sal_True);
650cdf0e10cSrcweir 	Init(nStart);	// Alle Eintraege bis zum Ende abgleichen
651cdf0e10cSrcweir 	return USHRT_MAX;
652cdf0e10cSrcweir }
653cdf0e10cSrcweir 
654cdf0e10cSrcweir /* -----------------05.06.98 13:57-------------------
655cdf0e10cSrcweir  *
656cdf0e10cSrcweir  * --------------------------------------------------*/
657cdf0e10cSrcweir 
658cdf0e10cSrcweir void SwRedlineAcceptDlg::InsertChilds(SwRedlineDataParent *pParent, const SwRedline& rRedln, const sal_uInt16 nAutoFmt)
659cdf0e10cSrcweir {
660cdf0e10cSrcweir 	String sChild;
661cdf0e10cSrcweir 	SwRedlineDataChild *pLastRedlineChild = 0;
662cdf0e10cSrcweir 	const SwRedlineData *pRedlineData = &rRedln.GetRedlineData();
663cdf0e10cSrcweir 	sal_Bool bAutoFmt = (rRedln.GetRealType() & nAutoFmt) != 0;
664cdf0e10cSrcweir 
665cdf0e10cSrcweir 	const String *pAction = &GetActionText(rRedln);
666cdf0e10cSrcweir 	sal_Bool bValidParent = !sFilterAction.Len() || sFilterAction == *pAction;
667cdf0e10cSrcweir 	bValidParent = bValidParent && pTable->IsValidEntry(&rRedln.GetAuthorString(), &rRedln.GetTimeStamp(), &rRedln.GetComment());
668cdf0e10cSrcweir 	if (nAutoFmt)
669cdf0e10cSrcweir 	{
670cdf0e10cSrcweir 		sal_uInt16 nPos;
671cdf0e10cSrcweir 
672cdf0e10cSrcweir 		if (pParent->pData->GetSeqNo() && !aUsedSeqNo.Insert(pParent, nPos))	// Gibts schon
673cdf0e10cSrcweir 		{
674cdf0e10cSrcweir 			if (pParent->pTLBParent)
675cdf0e10cSrcweir 			{
676cdf0e10cSrcweir 				pTable->SetEntryText(sAutoFormat, aUsedSeqNo[nPos]->pTLBParent, 0);
677cdf0e10cSrcweir                 pTable->RemoveEntry(pParent->pTLBParent);
678cdf0e10cSrcweir 				pParent->pTLBParent = 0;
679cdf0e10cSrcweir 			}
680cdf0e10cSrcweir 			return;
681cdf0e10cSrcweir 		}
682cdf0e10cSrcweir 		bValidParent = bValidParent && bAutoFmt;
683cdf0e10cSrcweir 	}
684cdf0e10cSrcweir 	sal_Bool bValidTree = bValidParent;
685cdf0e10cSrcweir 
686cdf0e10cSrcweir 	for (sal_uInt16 nStack = 1; nStack < rRedln.GetStackCount(); nStack++)
687cdf0e10cSrcweir 	{
688cdf0e10cSrcweir 		pRedlineData = pRedlineData->Next();
689cdf0e10cSrcweir 
690cdf0e10cSrcweir 		SwRedlineDataChildPtr pRedlineChild = new SwRedlineDataChild;
691cdf0e10cSrcweir 		pRedlineChild->pChild = pRedlineData;
692cdf0e10cSrcweir 		aRedlineChilds.Insert(pRedlineChild, aRedlineChilds.Count());
693cdf0e10cSrcweir 
694cdf0e10cSrcweir 		if ( pLastRedlineChild )
695cdf0e10cSrcweir 			pLastRedlineChild->pNext = pRedlineChild;
696cdf0e10cSrcweir 		else
697cdf0e10cSrcweir 			pParent->pNext = pRedlineChild;
698cdf0e10cSrcweir 
699cdf0e10cSrcweir 		pAction = &GetActionText(rRedln, nStack);
700cdf0e10cSrcweir 		sal_Bool bValidChild = !sFilterAction.Len() || sFilterAction == *pAction;
701cdf0e10cSrcweir 		bValidChild = bValidChild && pTable->IsValidEntry(&rRedln.GetAuthorString(nStack), &rRedln.GetTimeStamp(nStack), &rRedln.GetComment());
702cdf0e10cSrcweir 		if (nAutoFmt)
703cdf0e10cSrcweir 			bValidChild = bValidChild && bAutoFmt;
704cdf0e10cSrcweir 		bValidTree |= bValidChild;
705cdf0e10cSrcweir 
706cdf0e10cSrcweir 		if (bValidChild)
707cdf0e10cSrcweir 		{
708cdf0e10cSrcweir 			RedlinData *pData = new RedlinData;
709cdf0e10cSrcweir 			pData->pData = pRedlineChild;
710cdf0e10cSrcweir 			pData->bDisabled = sal_True;
711cdf0e10cSrcweir 			sChild = GetRedlineText(rRedln, pData->aDateTime, nStack);
712cdf0e10cSrcweir 
713cdf0e10cSrcweir 			SvLBoxEntry* pChild = pTable->InsertEntry(sChild, pData, pParent->pTLBParent);
714cdf0e10cSrcweir 
715cdf0e10cSrcweir 			pRedlineChild->pTLBChild = pChild;
716cdf0e10cSrcweir 			if (!bValidParent)
717cdf0e10cSrcweir 				pTable->Expand(pParent->pTLBParent);
718cdf0e10cSrcweir 		}
719cdf0e10cSrcweir 		else
720cdf0e10cSrcweir 			pRedlineChild->pTLBChild = 0;
721cdf0e10cSrcweir 
722cdf0e10cSrcweir 		pLastRedlineChild = pRedlineChild;
723cdf0e10cSrcweir 	}
724cdf0e10cSrcweir 
725cdf0e10cSrcweir 	if (pLastRedlineChild)
726cdf0e10cSrcweir 		pLastRedlineChild->pNext = 0;
727cdf0e10cSrcweir 
728cdf0e10cSrcweir 	if (!bValidTree && pParent->pTLBParent)
729cdf0e10cSrcweir 	{
730cdf0e10cSrcweir         pTable->RemoveEntry(pParent->pTLBParent);
731cdf0e10cSrcweir 		pParent->pTLBParent = 0;
732cdf0e10cSrcweir 		if (nAutoFmt)
733cdf0e10cSrcweir 			aUsedSeqNo.Remove(pParent);
734cdf0e10cSrcweir 	}
735cdf0e10cSrcweir }
736cdf0e10cSrcweir 
737cdf0e10cSrcweir /* -----------------05.06.98 15:20-------------------
738cdf0e10cSrcweir  *
739cdf0e10cSrcweir  * --------------------------------------------------*/
740cdf0e10cSrcweir 
741cdf0e10cSrcweir void SwRedlineAcceptDlg::RemoveParents(sal_uInt16 nStart, sal_uInt16 nEnd)
742cdf0e10cSrcweir {
743cdf0e10cSrcweir 	SwWrtShell* pSh = ::GetActiveView()->GetWrtShellPtr();
744cdf0e10cSrcweir 	sal_uInt16 nCount = pSh->GetRedlineCount();
745cdf0e10cSrcweir 
746cdf0e10cSrcweir 	SvLBoxEntryArr aLBoxArr;
747cdf0e10cSrcweir 
748cdf0e10cSrcweir 	// Wegen Bug der TLB, die bei Remove den SelectHandler IMMER ruft:
749cdf0e10cSrcweir 	pTable->SetSelectHdl(aOldSelectHdl);
750cdf0e10cSrcweir 	pTable->SetDeselectHdl(aOldDeselectHdl);
751cdf0e10cSrcweir 	sal_Bool bChildsRemoved = sal_False;
752cdf0e10cSrcweir 	pTable->SelectAll(sal_False);
753cdf0e10cSrcweir 
754cdf0e10cSrcweir 	// Hinter dem letzten Eintrag Cursor setzen, da sonst Performance-Problem in TLB.
755cdf0e10cSrcweir 	// TLB wuerde sonst bei jedem Remove den Cursor erneut umsetzen (teuer)
756cdf0e10cSrcweir 	sal_uInt16 nPos = Min((sal_uInt16)nCount, (sal_uInt16)aRedlineParents.Count());
757cdf0e10cSrcweir 	SvLBoxEntry *pCurEntry = NULL;
758cdf0e10cSrcweir 	while( ( pCurEntry == NULL ) && ( nPos > 0 ) )
759cdf0e10cSrcweir 	{
760cdf0e10cSrcweir 		--nPos;
761cdf0e10cSrcweir 		pCurEntry = aRedlineParents[nPos]->pTLBParent;
762cdf0e10cSrcweir 	}
763cdf0e10cSrcweir 
764cdf0e10cSrcweir 	if (pCurEntry)
765cdf0e10cSrcweir 		pTable->SetCurEntry(pCurEntry);
766cdf0e10cSrcweir 
767cdf0e10cSrcweir 	SvLBoxTreeList*	pModel = pTable->GetModel();
768cdf0e10cSrcweir 
769cdf0e10cSrcweir 	for (sal_uInt16 i = nStart; i <= nEnd; i++)
770cdf0e10cSrcweir 	{
771cdf0e10cSrcweir 		if (!bChildsRemoved && aRedlineParents[i]->pNext)
772cdf0e10cSrcweir 		{
773cdf0e10cSrcweir 			SwRedlineDataChildPtr pChildPtr = (SwRedlineDataChildPtr)aRedlineParents[i]->pNext;
774cdf0e10cSrcweir             sal_uInt16 nChildPos = aRedlineChilds.GetPos(pChildPtr);
775cdf0e10cSrcweir 
776cdf0e10cSrcweir             if (nChildPos != USHRT_MAX)
777cdf0e10cSrcweir 			{
778cdf0e10cSrcweir 				sal_uInt16 nChilds = 0;
779cdf0e10cSrcweir 
780cdf0e10cSrcweir 				while (pChildPtr)
781cdf0e10cSrcweir 				{
782cdf0e10cSrcweir 					pChildPtr = (SwRedlineDataChildPtr)pChildPtr->pNext;
783cdf0e10cSrcweir 					nChilds++;
784cdf0e10cSrcweir 				}
785cdf0e10cSrcweir 
786cdf0e10cSrcweir                 aRedlineChilds.DeleteAndDestroy(nChildPos, nChilds);
787cdf0e10cSrcweir 				bChildsRemoved = sal_True;
788cdf0e10cSrcweir 			}
789cdf0e10cSrcweir 		}
790cdf0e10cSrcweir 		SvLBoxEntry *pEntry = aRedlineParents[i]->pTLBParent;
791cdf0e10cSrcweir 		if (pEntry)
792cdf0e10cSrcweir 		{
793cdf0e10cSrcweir             long nIdx = aLBoxArr.Count() - 1L;
794cdf0e10cSrcweir 			sal_uLong nAbsPos = pModel->GetAbsPos(pEntry);
795cdf0e10cSrcweir 			while (nIdx >= 0 &&
796cdf0e10cSrcweir                     pModel->GetAbsPos(aLBoxArr[ static_cast< sal_uInt16 >(nIdx) ]) > nAbsPos)
797cdf0e10cSrcweir 				nIdx--;
798cdf0e10cSrcweir             aLBoxArr.Insert( pEntry, static_cast< sal_uInt16 >(++nIdx) );
799cdf0e10cSrcweir 		}
800cdf0e10cSrcweir 	}
801cdf0e10cSrcweir 
802cdf0e10cSrcweir 	// TLB von hinten abraeumen
803cdf0e10cSrcweir 	long nIdx = (long)aLBoxArr.Count() - 1L;
804cdf0e10cSrcweir 	while (nIdx >= 0)
805cdf0e10cSrcweir         pTable->RemoveEntry(aLBoxArr[ static_cast< sal_uInt16 >(nIdx--) ]);
806cdf0e10cSrcweir 
807cdf0e10cSrcweir 	pTable->SetSelectHdl(LINK(this, SwRedlineAcceptDlg, SelectHdl));
808cdf0e10cSrcweir 	pTable->SetDeselectHdl(LINK(this, SwRedlineAcceptDlg, DeselectHdl));
809cdf0e10cSrcweir 	// Durch Remove wurde leider wieder dauernd von der TLB selektiert...
810cdf0e10cSrcweir 	pTable->SelectAll(sal_False);
811cdf0e10cSrcweir 
812cdf0e10cSrcweir 	aRedlineParents.DeleteAndDestroy( nStart, nEnd - nStart + 1);
813cdf0e10cSrcweir }
814cdf0e10cSrcweir 
815cdf0e10cSrcweir /* -----------------05.06.98 15:20-------------------
816cdf0e10cSrcweir  *
817cdf0e10cSrcweir  * --------------------------------------------------*/
818cdf0e10cSrcweir 
819cdf0e10cSrcweir void SwRedlineAcceptDlg::InsertParents(sal_uInt16 nStart, sal_uInt16 nEnd)
820cdf0e10cSrcweir {
821cdf0e10cSrcweir 	SwView *pView	= ::GetActiveView();
822cdf0e10cSrcweir 	SwWrtShell* pSh	= pView->GetWrtShellPtr();
823cdf0e10cSrcweir 	sal_uInt16 nAutoFmt	= HasRedlineAutoFmt() ? nsRedlineType_t::REDLINE_FORM_AUTOFMT : 0;
824cdf0e10cSrcweir 
825cdf0e10cSrcweir 	String sParent;
826cdf0e10cSrcweir 	sal_uInt16 nCount = pSh->GetRedlineCount();
827cdf0e10cSrcweir 	nEnd = Min((sal_uInt16)nEnd, (sal_uInt16)(nCount - 1));	// Handelt auch nEnd=USHRT_MAX (bis zum Ende) ab
828cdf0e10cSrcweir 
829cdf0e10cSrcweir 	if (nEnd == USHRT_MAX)
830cdf0e10cSrcweir 		return;		// Keine Redlines im Dokument
831cdf0e10cSrcweir 
832cdf0e10cSrcweir 	RedlinData *pData;
833cdf0e10cSrcweir     SvLBoxEntry *pParent;
834cdf0e10cSrcweir 	SwRedlineDataParentPtr pRedlineParent;
835cdf0e10cSrcweir 	const SwRedline* pCurrRedline;
836cdf0e10cSrcweir 	if( !nStart && !pTable->FirstSelected() )
837cdf0e10cSrcweir 	{
838cdf0e10cSrcweir 		pCurrRedline = pSh->GetCurrRedline();
839cdf0e10cSrcweir 		if( !pCurrRedline )
840cdf0e10cSrcweir 		{
841cdf0e10cSrcweir 			pSh->SwCrsrShell::Push();
842cdf0e10cSrcweir 			if( 0 == (pCurrRedline = pSh->SelNextRedline()))
843cdf0e10cSrcweir 				pCurrRedline = pSh->SelPrevRedline();
844cdf0e10cSrcweir 			pSh->SwCrsrShell::Pop( sal_False );
845cdf0e10cSrcweir 		}
846cdf0e10cSrcweir 	}
847cdf0e10cSrcweir 	else
848cdf0e10cSrcweir 		pCurrRedline = 0;
849cdf0e10cSrcweir 
850cdf0e10cSrcweir 	for (sal_uInt16 i = nStart; i <= nEnd; i++)
851cdf0e10cSrcweir 	{
852cdf0e10cSrcweir 		const SwRedline& rRedln = pSh->GetRedline(i);
853cdf0e10cSrcweir 		const SwRedlineData *pRedlineData = &rRedln.GetRedlineData();
854cdf0e10cSrcweir 
855cdf0e10cSrcweir 		pRedlineParent = new SwRedlineDataParent;
856cdf0e10cSrcweir 		pRedlineParent->pData	 = pRedlineData;
857cdf0e10cSrcweir 		pRedlineParent->pNext	 = 0;
858cdf0e10cSrcweir 		String sComment(rRedln.GetComment());
859cdf0e10cSrcweir 		sComment.SearchAndReplaceAll((sal_Unicode)_LF,(sal_Unicode)' ');
860cdf0e10cSrcweir 		pRedlineParent->sComment = sComment;
861cdf0e10cSrcweir 		aRedlineParents.Insert(pRedlineParent, i);
862cdf0e10cSrcweir 
863cdf0e10cSrcweir 		pData = new RedlinData;
864cdf0e10cSrcweir 		pData->pData = pRedlineParent;
865cdf0e10cSrcweir 		pData->bDisabled = sal_False;
866cdf0e10cSrcweir 
867cdf0e10cSrcweir 		sParent = GetRedlineText(rRedln, pData->aDateTime);
868cdf0e10cSrcweir 		pParent = pTable->InsertEntry(sParent, pData, 0, i);
869cdf0e10cSrcweir 		if( pCurrRedline == &rRedln )
870cdf0e10cSrcweir 		{
871cdf0e10cSrcweir 			pTable->SetCurEntry( pParent );
872cdf0e10cSrcweir 			pTable->Select( pParent );
873cdf0e10cSrcweir 			pTable->MakeVisible( pParent );
874cdf0e10cSrcweir 		}
875cdf0e10cSrcweir 
876cdf0e10cSrcweir 		pRedlineParent->pTLBParent = pParent;
877cdf0e10cSrcweir 
878cdf0e10cSrcweir 		InsertChilds(pRedlineParent, rRedln, nAutoFmt);
879cdf0e10cSrcweir 	}
880cdf0e10cSrcweir }
881cdf0e10cSrcweir 
882cdf0e10cSrcweir /* -----------------05.06.98 13:06-------------------
883cdf0e10cSrcweir  *
884cdf0e10cSrcweir  * --------------------------------------------------*/
885cdf0e10cSrcweir 
886cdf0e10cSrcweir void SwRedlineAcceptDlg::CallAcceptReject( sal_Bool bSelect, sal_Bool bAccept )
887cdf0e10cSrcweir {
888cdf0e10cSrcweir 	SwWrtShell* pSh = ::GetActiveView()->GetWrtShellPtr();
889cdf0e10cSrcweir 	SvLBoxEntry* pEntry = bSelect ? pTable->FirstSelected() : pTable->First();
890cdf0e10cSrcweir 	sal_uLong nPos = LONG_MAX;
891cdf0e10cSrcweir 
892cdf0e10cSrcweir     typedef std::vector<SvLBoxEntry*> ListBoxEntries_t;
893cdf0e10cSrcweir     ListBoxEntries_t aRedlines;
894cdf0e10cSrcweir 
895cdf0e10cSrcweir     // don't activate
896cdf0e10cSrcweir     DBG_ASSERT( bInhibitActivate == false,
897cdf0e10cSrcweir                 "recursive call of CallAcceptReject?");
898cdf0e10cSrcweir     bInhibitActivate = true;
899cdf0e10cSrcweir 
900cdf0e10cSrcweir     // collect redlines-to-be-accepted/rejected in aRedlines vector
901cdf0e10cSrcweir 	while( pEntry )
902cdf0e10cSrcweir 	{
903cdf0e10cSrcweir 		if( !pTable->GetParent( pEntry ) )
904cdf0e10cSrcweir 		{
905cdf0e10cSrcweir 			if( bSelect && LONG_MAX == nPos )
906cdf0e10cSrcweir 				nPos = pTable->GetModel()->GetAbsPos( pEntry );
907cdf0e10cSrcweir 
908cdf0e10cSrcweir 			RedlinData *pData = (RedlinData *)pEntry->GetUserData();
909cdf0e10cSrcweir 
910cdf0e10cSrcweir 			if( !pData->bDisabled )
911cdf0e10cSrcweir 				aRedlines.push_back( pEntry );
912cdf0e10cSrcweir 		}
913cdf0e10cSrcweir 
914cdf0e10cSrcweir 		pEntry = bSelect ? pTable->NextSelected(pEntry) : pTable->Next(pEntry);
915cdf0e10cSrcweir 	}
916cdf0e10cSrcweir 
917cdf0e10cSrcweir 	sal_Bool (SwEditShell:: *FnAccRej)( sal_uInt16 ) = &SwEditShell::AcceptRedline;
918cdf0e10cSrcweir 	if( !bAccept )
919cdf0e10cSrcweir 		FnAccRej = &SwEditShell::RejectRedline;
920cdf0e10cSrcweir 
921cdf0e10cSrcweir 	SwWait aWait( *pSh->GetView().GetDocShell(), sal_True );
922cdf0e10cSrcweir 	pSh->StartAction();
923cdf0e10cSrcweir 
924cdf0e10cSrcweir     // #111827#
925cdf0e10cSrcweir     if (aRedlines.size() > 1)
926cdf0e10cSrcweir     {
927cdf0e10cSrcweir         String aTmpStr;
928cdf0e10cSrcweir         {
929cdf0e10cSrcweir             SwRewriter aRewriter;
930cdf0e10cSrcweir             aRewriter.AddRule(UNDO_ARG1,
931cdf0e10cSrcweir                               String::CreateFromInt32(aRedlines.size()));
932cdf0e10cSrcweir             aTmpStr = aRewriter.Apply(String(SW_RES(STR_N_REDLINES)));
933cdf0e10cSrcweir         }
934cdf0e10cSrcweir 
935cdf0e10cSrcweir         SwRewriter aRewriter;
936cdf0e10cSrcweir         aRewriter.AddRule(UNDO_ARG1, aTmpStr);
937cdf0e10cSrcweir 
938cdf0e10cSrcweir         pSh->StartUndo(bAccept? UNDO_ACCEPT_REDLINE : UNDO_REJECT_REDLINE,
939cdf0e10cSrcweir                        &aRewriter);
940cdf0e10cSrcweir     }
941cdf0e10cSrcweir 
942cdf0e10cSrcweir     // accept/reject the the redlines in aRedlines. The absolute
943cdf0e10cSrcweir     // position may change during the process (e.g. when two redlines
944cdf0e10cSrcweir     // are merged in result of another one being deleted), so the
945cdf0e10cSrcweir     // position must be resolved late and checked before using it.
946cdf0e10cSrcweir     // (cf #102547#)
947cdf0e10cSrcweir     ListBoxEntries_t::iterator aEnd = aRedlines.end();
948cdf0e10cSrcweir 	for( ListBoxEntries_t::iterator aIter = aRedlines.begin();
949cdf0e10cSrcweir          aIter != aEnd;
950cdf0e10cSrcweir          aIter++ )
951cdf0e10cSrcweir     {
952cdf0e10cSrcweir         sal_uInt16 nPosition = GetRedlinePos( **aIter );
953cdf0e10cSrcweir         if( nPosition != USHRT_MAX )
954cdf0e10cSrcweir             (pSh->*FnAccRej)( nPosition );
955cdf0e10cSrcweir     }
956cdf0e10cSrcweir 
957cdf0e10cSrcweir     // #111827#
958cdf0e10cSrcweir     if (aRedlines.size() > 1)
959cdf0e10cSrcweir     {
960cdf0e10cSrcweir         pSh->EndUndo();
961cdf0e10cSrcweir     }
962cdf0e10cSrcweir 
963cdf0e10cSrcweir 	pSh->EndAction();
964cdf0e10cSrcweir 
965cdf0e10cSrcweir     bInhibitActivate = false;
966cdf0e10cSrcweir 	Activate();
967cdf0e10cSrcweir 
968cdf0e10cSrcweir 	if( ULONG_MAX != nPos && pTable->GetEntryCount() )
969cdf0e10cSrcweir 	{
970cdf0e10cSrcweir 		if( nPos >= pTable->GetEntryCount() )
971cdf0e10cSrcweir 			nPos = pTable->GetEntryCount() - 1;
972cdf0e10cSrcweir 		pEntry = pTable->GetEntry( nPos );
973cdf0e10cSrcweir 		if( !pEntry && nPos-- )
974cdf0e10cSrcweir 			pEntry = pTable->GetEntry( nPos );
975cdf0e10cSrcweir 		if( pEntry )
976cdf0e10cSrcweir 		{
977cdf0e10cSrcweir 			pTable->Select( pEntry );
978cdf0e10cSrcweir 			pTable->MakeVisible( pEntry );
979cdf0e10cSrcweir 			pTable->SetCurEntry(pEntry);
980cdf0e10cSrcweir 		}
981cdf0e10cSrcweir 	}
982cdf0e10cSrcweir 	pTPView->EnableUndo();
983cdf0e10cSrcweir }
984cdf0e10cSrcweir 
985cdf0e10cSrcweir /*--------------------------------------------------------------------
986cdf0e10cSrcweir 	Beschreibung:
987cdf0e10cSrcweir  --------------------------------------------------------------------*/
988cdf0e10cSrcweir 
989cdf0e10cSrcweir sal_uInt16 SwRedlineAcceptDlg::GetRedlinePos( const SvLBoxEntry& rEntry ) const
990cdf0e10cSrcweir {
991cdf0e10cSrcweir 	SwWrtShell* pSh = ::GetActiveView()->GetWrtShellPtr();
992cdf0e10cSrcweir 	return pSh->FindRedlineOfData( *((SwRedlineDataParent*)((RedlinData *)
993cdf0e10cSrcweir 									rEntry.GetUserData())->pData)->pData );
994cdf0e10cSrcweir }
995cdf0e10cSrcweir 
996cdf0e10cSrcweir /*--------------------------------------------------------------------
997cdf0e10cSrcweir 	Beschreibung:
998cdf0e10cSrcweir  --------------------------------------------------------------------*/
999cdf0e10cSrcweir 
1000cdf0e10cSrcweir IMPL_LINK( SwRedlineAcceptDlg, AcceptHdl, void*, EMPTYARG)
1001cdf0e10cSrcweir {
1002cdf0e10cSrcweir 	CallAcceptReject( sal_True, sal_True );
1003cdf0e10cSrcweir 	return 0;
1004cdf0e10cSrcweir }
1005cdf0e10cSrcweir 
1006cdf0e10cSrcweir /*--------------------------------------------------------------------
1007cdf0e10cSrcweir 	Beschreibung:
1008cdf0e10cSrcweir  --------------------------------------------------------------------*/
1009cdf0e10cSrcweir 
1010cdf0e10cSrcweir IMPL_LINK( SwRedlineAcceptDlg, AcceptAllHdl, void*, EMPTYARG )
1011cdf0e10cSrcweir {
1012cdf0e10cSrcweir 	CallAcceptReject( sal_False, sal_True );
1013cdf0e10cSrcweir 	return 0;
1014cdf0e10cSrcweir }
1015cdf0e10cSrcweir 
1016cdf0e10cSrcweir /*--------------------------------------------------------------------
1017cdf0e10cSrcweir 	Beschreibung:
1018cdf0e10cSrcweir  --------------------------------------------------------------------*/
1019cdf0e10cSrcweir 
1020cdf0e10cSrcweir IMPL_LINK( SwRedlineAcceptDlg, RejectHdl, void*, EMPTYARG )
1021cdf0e10cSrcweir {
1022cdf0e10cSrcweir 	CallAcceptReject( sal_True, sal_False );
1023cdf0e10cSrcweir 	return 0;
1024cdf0e10cSrcweir }
1025cdf0e10cSrcweir 
1026cdf0e10cSrcweir /*--------------------------------------------------------------------
1027cdf0e10cSrcweir 	Beschreibung:
1028cdf0e10cSrcweir  --------------------------------------------------------------------*/
1029cdf0e10cSrcweir 
1030cdf0e10cSrcweir IMPL_LINK( SwRedlineAcceptDlg, RejectAllHdl, void*, EMPTYARG )
1031cdf0e10cSrcweir {
1032cdf0e10cSrcweir 	CallAcceptReject( sal_False, sal_False );
1033cdf0e10cSrcweir 	return 0;
1034cdf0e10cSrcweir }
1035cdf0e10cSrcweir 
1036cdf0e10cSrcweir /*--------------------------------------------------------------------
1037cdf0e10cSrcweir 	Beschreibung:
1038cdf0e10cSrcweir  --------------------------------------------------------------------*/
1039cdf0e10cSrcweir 
1040cdf0e10cSrcweir IMPL_LINK( SwRedlineAcceptDlg, UndoHdl, void*, EMPTYARG )
1041cdf0e10cSrcweir {
1042cdf0e10cSrcweir 	SwView * pView = ::GetActiveView();
1043cdf0e10cSrcweir 	pView->GetViewFrame()->GetDispatcher()->
1044cdf0e10cSrcweir 				Execute(SID_UNDO, SFX_CALLMODE_SYNCHRON);
1045cdf0e10cSrcweir 	pTPView->EnableUndo(pView->GetSlotState(SID_UNDO) != 0);
1046cdf0e10cSrcweir 
1047cdf0e10cSrcweir 	Activate();
1048cdf0e10cSrcweir 
1049cdf0e10cSrcweir 	return 0;
1050cdf0e10cSrcweir }
1051cdf0e10cSrcweir 
1052cdf0e10cSrcweir /*--------------------------------------------------------------------
1053cdf0e10cSrcweir 	Beschreibung:
1054cdf0e10cSrcweir  --------------------------------------------------------------------*/
1055cdf0e10cSrcweir 
1056cdf0e10cSrcweir IMPL_LINK( SwRedlineAcceptDlg, FilterChangedHdl, void*, EMPTYARG )
1057cdf0e10cSrcweir {
1058cdf0e10cSrcweir 	SvxTPFilter *pFilterTP = aTabPagesCTRL.GetFilterPage();
1059cdf0e10cSrcweir 
1060cdf0e10cSrcweir 	if (pFilterTP->IsAction())
1061cdf0e10cSrcweir 		sFilterAction = pFilterTP->GetLbAction()->GetSelectEntry();
1062cdf0e10cSrcweir 	else
1063cdf0e10cSrcweir 		sFilterAction = aEmptyStr;
1064cdf0e10cSrcweir 
1065cdf0e10cSrcweir 	Init();
1066cdf0e10cSrcweir 
1067cdf0e10cSrcweir 	return 0;
1068cdf0e10cSrcweir }
1069cdf0e10cSrcweir 
1070cdf0e10cSrcweir /*--------------------------------------------------------------------
1071cdf0e10cSrcweir 	Beschreibung:
1072cdf0e10cSrcweir  --------------------------------------------------------------------*/
1073cdf0e10cSrcweir 
1074cdf0e10cSrcweir IMPL_LINK( SwRedlineAcceptDlg, DeselectHdl, void*, EMPTYARG )
1075cdf0e10cSrcweir {
1076cdf0e10cSrcweir 	// Flackern der Buttons vermeiden:
1077cdf0e10cSrcweir 	aDeselectTimer.Start();
1078cdf0e10cSrcweir 
1079cdf0e10cSrcweir 	return 0;
1080cdf0e10cSrcweir }
1081cdf0e10cSrcweir 
1082cdf0e10cSrcweir /*--------------------------------------------------------------------
1083cdf0e10cSrcweir 	Beschreibung:
1084cdf0e10cSrcweir  --------------------------------------------------------------------*/
1085cdf0e10cSrcweir 
1086cdf0e10cSrcweir IMPL_LINK( SwRedlineAcceptDlg, SelectHdl, void*, EMPTYARG )
1087cdf0e10cSrcweir {
1088cdf0e10cSrcweir 	aDeselectTimer.Stop();
1089cdf0e10cSrcweir 	aSelectTimer.Start();
1090cdf0e10cSrcweir 
1091cdf0e10cSrcweir 	return 0;
1092cdf0e10cSrcweir }
1093cdf0e10cSrcweir 
1094cdf0e10cSrcweir /*--------------------------------------------------------------------
1095cdf0e10cSrcweir 	Beschreibung:
1096cdf0e10cSrcweir  --------------------------------------------------------------------*/
1097cdf0e10cSrcweir 
1098cdf0e10cSrcweir IMPL_LINK( SwRedlineAcceptDlg, GotoHdl, void*, EMPTYARG )
1099cdf0e10cSrcweir {
1100cdf0e10cSrcweir 	SwWrtShell* pSh = ::GetActiveView()->GetWrtShellPtr();
1101cdf0e10cSrcweir 	aSelectTimer.Stop();
1102cdf0e10cSrcweir 
1103cdf0e10cSrcweir 	sal_Bool bIsNotFormated = sal_False;
1104cdf0e10cSrcweir 	sal_Bool bSel = sal_False;
1105cdf0e10cSrcweir //  sal_Bool bReadonlySel = sal_False;
1106cdf0e10cSrcweir 
1107cdf0e10cSrcweir     //#98883# don't select redlines while the dialog is not focussed
1108cdf0e10cSrcweir     //#107938# But not only ask pTable if it has the focus. To move
1109cdf0e10cSrcweir     //         the selection to the selected redline any child of pParentDlg
1110cdf0e10cSrcweir     //         may the focus.
1111cdf0e10cSrcweir     SvLBoxEntry* pSelEntry = 0;
1112cdf0e10cSrcweir 
1113cdf0e10cSrcweir     if (pParentDlg->HasChildPathFocus())
1114cdf0e10cSrcweir         pSelEntry = pTable->FirstSelected();
1115cdf0e10cSrcweir 
1116cdf0e10cSrcweir     if( pSelEntry )
1117cdf0e10cSrcweir 	{
1118cdf0e10cSrcweir 		SvLBoxEntry* pActEntry = pSelEntry;
1119cdf0e10cSrcweir 		pSh->StartAction();
1120cdf0e10cSrcweir 		pSh->EnterStdMode();
1121cdf0e10cSrcweir 		pSh->SetCareWin(pParentDlg);
1122cdf0e10cSrcweir 
1123cdf0e10cSrcweir 		while (pSelEntry)
1124cdf0e10cSrcweir 		{
1125cdf0e10cSrcweir 			if (pTable->GetParent(pSelEntry))
1126cdf0e10cSrcweir 			{
1127cdf0e10cSrcweir 				pActEntry = pTable->GetParent(pSelEntry);
1128cdf0e10cSrcweir 
1129cdf0e10cSrcweir 				if (pTable->IsSelected(pActEntry))
1130cdf0e10cSrcweir 				{
1131cdf0e10cSrcweir 					pSelEntry = pActEntry = pTable->NextSelected(pSelEntry);
1132cdf0e10cSrcweir 					continue;	// Nicht zweimal selektieren
1133cdf0e10cSrcweir 				}
1134cdf0e10cSrcweir 			}
1135cdf0e10cSrcweir 			else
1136cdf0e10cSrcweir 				bSel = sal_True;
1137cdf0e10cSrcweir 
1138cdf0e10cSrcweir 			// #98864# find the selected redline (ignore, if the redline is already gone)
1139cdf0e10cSrcweir 			sal_uInt16 nPos = GetRedlinePos(*pActEntry);
1140cdf0e10cSrcweir 			if( nPos != USHRT_MAX )
1141cdf0e10cSrcweir 			{
1142cdf0e10cSrcweir 
1143cdf0e10cSrcweir 				const SwRedline& rRedln = pSh->GetRedline( nPos );
1144cdf0e10cSrcweir 				bIsNotFormated |= nsRedlineType_t::REDLINE_FORMAT != rRedln.GetType();
1145cdf0e10cSrcweir 
1146cdf0e10cSrcweir //JP 27.9.2001: make no sense if we handle readonly sections
1147cdf0e10cSrcweir //			if( !bReadonlySel && rRedln.HasReadonlySel() )
1148cdf0e10cSrcweir //				bReadonlySel = sal_True;
1149cdf0e10cSrcweir 
1150cdf0e10cSrcweir 				if (pSh->GotoRedline(nPos, sal_True))
1151cdf0e10cSrcweir 				{
1152cdf0e10cSrcweir 					pSh->SetInSelect();
1153cdf0e10cSrcweir 					pSh->EnterAddMode();
1154cdf0e10cSrcweir 				}
1155cdf0e10cSrcweir 			}
1156cdf0e10cSrcweir 
1157cdf0e10cSrcweir             pSelEntry = pActEntry = pTable->NextSelected(pSelEntry);
1158cdf0e10cSrcweir 		}
1159cdf0e10cSrcweir 
1160cdf0e10cSrcweir 		pSh->LeaveAddMode();
1161cdf0e10cSrcweir 		pSh->EndAction();
1162cdf0e10cSrcweir 		pSh->SetCareWin(NULL);
1163cdf0e10cSrcweir 	}
1164cdf0e10cSrcweir     sal_Bool bEnable = !pSh->getIDocumentRedlineAccess()->GetRedlinePassword().getLength();
1165cdf0e10cSrcweir     pTPView->EnableAccept( bEnable && bSel /*&& !bReadonlySel*/ );
1166cdf0e10cSrcweir     pTPView->EnableReject( bEnable && bSel && bIsNotFormated /*&& !bReadonlySel*/ );
1167cdf0e10cSrcweir     pTPView->EnableRejectAll( bEnable && !bOnlyFormatedRedlines && !bHasReadonlySel );
1168cdf0e10cSrcweir 
1169cdf0e10cSrcweir 	return 0;
1170cdf0e10cSrcweir }
1171cdf0e10cSrcweir 
1172cdf0e10cSrcweir /*--------------------------------------------------------------------
1173cdf0e10cSrcweir 	Beschreibung:
1174cdf0e10cSrcweir  --------------------------------------------------------------------*/
1175cdf0e10cSrcweir 
1176cdf0e10cSrcweir IMPL_LINK( SwRedlineAcceptDlg, CommandHdl, void*, EMPTYARG )
1177cdf0e10cSrcweir {
1178cdf0e10cSrcweir 	const CommandEvent aCEvt(pTable->GetCommandEvent());
1179cdf0e10cSrcweir 
1180cdf0e10cSrcweir 	switch ( aCEvt.GetCommand() )
1181cdf0e10cSrcweir 	{
1182cdf0e10cSrcweir 		case COMMAND_CONTEXTMENU:
1183cdf0e10cSrcweir 		{
1184cdf0e10cSrcweir 			SwWrtShell* pSh = ::GetActiveView()->GetWrtShellPtr();
1185cdf0e10cSrcweir 			SvLBoxEntry* pEntry = pTable->FirstSelected();
1186cdf0e10cSrcweir 			const SwRedline *pRed = 0;
1187cdf0e10cSrcweir 
1188cdf0e10cSrcweir 			if (pEntry)
1189cdf0e10cSrcweir 			{
1190cdf0e10cSrcweir 				SvLBoxEntry* pTopEntry = pEntry;
1191cdf0e10cSrcweir 
1192cdf0e10cSrcweir 				if (pTable->GetParent(pEntry))
1193cdf0e10cSrcweir 					pTopEntry = pTable->GetParent(pEntry);
1194cdf0e10cSrcweir 
1195cdf0e10cSrcweir 				sal_uInt16 nPos = GetRedlinePos(*pTopEntry);
1196cdf0e10cSrcweir 
1197cdf0e10cSrcweir 				// Bei geschuetzten Bereichen kommentieren disablen
1198cdf0e10cSrcweir 				if ((pRed = pSh->GotoRedline(nPos, sal_True)) != 0)
1199cdf0e10cSrcweir 				{
1200cdf0e10cSrcweir 					if( pSh->IsCrsrPtAtEnd() )
1201cdf0e10cSrcweir 						pSh->SwapPam();
1202cdf0e10cSrcweir 					pSh->SetInSelect();
1203cdf0e10cSrcweir 				}
1204cdf0e10cSrcweir 			}
1205cdf0e10cSrcweir 
1206cdf0e10cSrcweir 			aPopup.EnableItem( MN_EDIT_COMMENT, pEntry && pRed &&
1207cdf0e10cSrcweir 											!pTable->GetParent(pEntry) &&
1208cdf0e10cSrcweir 											!pTable->NextSelected(pEntry)
1209cdf0e10cSrcweir //JP 27.9.2001: make no sense if we handle readonly sections
1210cdf0e10cSrcweir //											&& pRed->HasReadonlySel()
1211cdf0e10cSrcweir 											);
1212cdf0e10cSrcweir 
1213cdf0e10cSrcweir 			aPopup.EnableItem( MN_SUB_SORT, pTable->First() != 0 );
1214cdf0e10cSrcweir 			sal_uInt16 nColumn = pTable->GetSortedCol();
1215cdf0e10cSrcweir 			if (nColumn == 0xffff)
1216cdf0e10cSrcweir 				nColumn = 4;
1217cdf0e10cSrcweir 
1218cdf0e10cSrcweir 			PopupMenu *pSubMenu = aPopup.GetPopupMenu(MN_SUB_SORT);
1219cdf0e10cSrcweir 			if (pSubMenu)
1220cdf0e10cSrcweir 			{
1221cdf0e10cSrcweir 				for (sal_uInt16 i = MN_SORT_ACTION; i < MN_SORT_ACTION + 5; i++)
1222cdf0e10cSrcweir 					pSubMenu->CheckItem(i, sal_False);
1223cdf0e10cSrcweir 
1224cdf0e10cSrcweir 				pSubMenu->CheckItem(nColumn + MN_SORT_ACTION);
1225cdf0e10cSrcweir 			}
1226cdf0e10cSrcweir 
1227cdf0e10cSrcweir 			sal_uInt16 nRet = aPopup.Execute(pTable, aCEvt.GetMousePosPixel());
1228cdf0e10cSrcweir 
1229cdf0e10cSrcweir 			switch( nRet )
1230cdf0e10cSrcweir 			{
1231cdf0e10cSrcweir 				case MN_EDIT_COMMENT:
1232cdf0e10cSrcweir 				{
1233cdf0e10cSrcweir 					String sComment;
1234cdf0e10cSrcweir 					if (pEntry)
1235cdf0e10cSrcweir 					{
1236cdf0e10cSrcweir 						if (pTable->GetParent(pEntry))
1237cdf0e10cSrcweir 							pEntry = pTable->GetParent(pEntry);
1238cdf0e10cSrcweir 
1239cdf0e10cSrcweir 						sal_uInt16 nPos = GetRedlinePos(*pEntry);
1240cdf0e10cSrcweir 						const SwRedline &rRedline = pSh->GetRedline(nPos);
1241cdf0e10cSrcweir 
1242cdf0e10cSrcweir 
1243cdf0e10cSrcweir 						/* enable again once we have redline comments in the margin
1244cdf0e10cSrcweir 						sComment = rRedline.GetComment();
1245cdf0e10cSrcweir 						if ( sComment == String(::rtl::OUString::createFromAscii("")) )
1246cdf0e10cSrcweir 							GetActiveView()->GetDocShell()->Broadcast(SwRedlineHint(&rRedline,SWREDLINE_INSERTED));
1247cdf0e10cSrcweir 						const_cast<SwRedline&>(rRedline).Broadcast(SwRedlineHint(&rRedline,SWREDLINE_FOCUS));
1248cdf0e10cSrcweir 						*/
1249cdf0e10cSrcweir 
1250cdf0e10cSrcweir 						sComment = rRedline.GetComment();
1251cdf0e10cSrcweir 						SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
1252cdf0e10cSrcweir                         DBG_ASSERT(pFact, "Dialogdiet fail!");
1253cdf0e10cSrcweir 						::DialogGetRanges fnGetRange = pFact->GetDialogGetRangesFunc( RID_SVXDLG_POSTIT );
1254cdf0e10cSrcweir                         DBG_ASSERT(fnGetRange, "Dialogdiet fail! GetRanges()");
1255cdf0e10cSrcweir 						SfxItemSet aSet( pSh->GetAttrPool(), fnGetRange() );
1256cdf0e10cSrcweir 
1257cdf0e10cSrcweir 						aSet.Put(SvxPostItTextItem(sComment.ConvertLineEnd(), SID_ATTR_POSTIT_TEXT));
1258cdf0e10cSrcweir 						aSet.Put(SvxPostItAuthorItem(rRedline.GetAuthorString(), SID_ATTR_POSTIT_AUTHOR));
1259cdf0e10cSrcweir 
1260cdf0e10cSrcweir 						aSet.Put(SvxPostItDateItem( GetAppLangDateTimeString(
1261cdf0e10cSrcweir 									rRedline.GetRedlineData().GetTimeStamp() ),
1262cdf0e10cSrcweir 									SID_ATTR_POSTIT_DATE ));
1263cdf0e10cSrcweir 
1264cdf0e10cSrcweir                         AbstractSvxPostItDialog* pDlg = pFact->CreateSvxPostItDialog( pParentDlg, aSet, sal_False );
1265cdf0e10cSrcweir                         DBG_ASSERT(pDlg, "Dialogdiet fail!");
1266cdf0e10cSrcweir 
1267cdf0e10cSrcweir 						pDlg->HideAuthor();
1268cdf0e10cSrcweir 
1269cdf0e10cSrcweir 						sal_uInt16 nResId = 0;
1270cdf0e10cSrcweir 						switch( rRedline.GetType() )
1271cdf0e10cSrcweir 						{
1272cdf0e10cSrcweir 						case nsRedlineType_t::REDLINE_INSERT:
1273cdf0e10cSrcweir 							nResId = STR_REDLINE_INSERTED;
1274cdf0e10cSrcweir 							break;
1275cdf0e10cSrcweir 						case nsRedlineType_t::REDLINE_DELETE:
1276cdf0e10cSrcweir 							nResId = STR_REDLINE_DELETED;
1277cdf0e10cSrcweir 							break;
1278cdf0e10cSrcweir 						case nsRedlineType_t::REDLINE_FORMAT:
1279cdf0e10cSrcweir 							nResId = STR_REDLINE_FORMATED;
1280cdf0e10cSrcweir 							break;
1281cdf0e10cSrcweir 						case nsRedlineType_t::REDLINE_TABLE:
1282cdf0e10cSrcweir 							nResId = STR_REDLINE_TABLECHG;
1283cdf0e10cSrcweir 							break;
1284cdf0e10cSrcweir                         default:;//prevent warning
1285cdf0e10cSrcweir 						}
1286cdf0e10cSrcweir 						String sTitle(SW_RES(STR_REDLINE_COMMENT));
1287cdf0e10cSrcweir 						if( nResId )
1288cdf0e10cSrcweir 							sTitle += SW_RESSTR( nResId );
1289cdf0e10cSrcweir 						pDlg->SetText(sTitle);
1290cdf0e10cSrcweir 
1291cdf0e10cSrcweir 						pSh->SetCareWin(pDlg->GetWindow());
1292cdf0e10cSrcweir 
1293cdf0e10cSrcweir 						if ( pDlg->Execute() == RET_OK )
1294cdf0e10cSrcweir 						{
1295cdf0e10cSrcweir 							const SfxItemSet* pOutSet = pDlg->GetOutputItemSet();
1296cdf0e10cSrcweir 							String sMsg(((const SvxPostItTextItem&)pOutSet->Get(SID_ATTR_POSTIT_TEXT)).GetValue());
1297cdf0e10cSrcweir 
1298cdf0e10cSrcweir 							// Kommentar einfuegen bzw aendern
1299cdf0e10cSrcweir 							pSh->SetRedlineComment(sMsg);
1300cdf0e10cSrcweir 							sMsg.SearchAndReplaceAll((sal_Unicode)_LF,(sal_Unicode)' ');
1301cdf0e10cSrcweir 							pTable->SetEntryText(sMsg, pEntry, 3);
1302cdf0e10cSrcweir 						}
1303cdf0e10cSrcweir 
1304cdf0e10cSrcweir 						delete pDlg;
1305cdf0e10cSrcweir 						pSh->SetCareWin(NULL);
1306cdf0e10cSrcweir 					}
1307cdf0e10cSrcweir 
1308cdf0e10cSrcweir 				}
1309cdf0e10cSrcweir 				break;
1310cdf0e10cSrcweir 
1311cdf0e10cSrcweir 			case MN_SORT_ACTION:
1312cdf0e10cSrcweir 			case MN_SORT_AUTHOR:
1313cdf0e10cSrcweir 			case MN_SORT_DATE:
1314cdf0e10cSrcweir 			case MN_SORT_COMMENT:
1315cdf0e10cSrcweir 			case MN_SORT_POSITION:
1316cdf0e10cSrcweir 				{
1317cdf0e10cSrcweir 					bSortDir = sal_True;
1318cdf0e10cSrcweir 					if (nRet - MN_SORT_ACTION == 4 && pTable->GetSortedCol() == 0xffff)
1319cdf0e10cSrcweir 						break;	// Haben wir schon
1320cdf0e10cSrcweir 
1321cdf0e10cSrcweir 					nSortMode = nRet - MN_SORT_ACTION;
1322cdf0e10cSrcweir 					if (nSortMode == 4)
1323cdf0e10cSrcweir 						nSortMode = 0xffff;	// unsortiert bzw sortiert nach Position
1324cdf0e10cSrcweir 
1325cdf0e10cSrcweir 					if (pTable->GetSortedCol() == nSortMode)
1326cdf0e10cSrcweir 						bSortDir = !pTable->GetSortDirection();
1327cdf0e10cSrcweir 
1328cdf0e10cSrcweir 					SwWait aWait( *::GetActiveView()->GetDocShell(), sal_False );
1329cdf0e10cSrcweir 					pTable->SortByCol(nSortMode, bSortDir);
1330cdf0e10cSrcweir 					if (nSortMode == 0xffff)
1331cdf0e10cSrcweir 						Init();				// Alles neu fuellen
1332cdf0e10cSrcweir 				}
1333cdf0e10cSrcweir 				break;
1334cdf0e10cSrcweir 			}
1335cdf0e10cSrcweir 		}
1336cdf0e10cSrcweir 		break;
1337cdf0e10cSrcweir 	}
1338cdf0e10cSrcweir 
1339cdf0e10cSrcweir 	return 0;
1340cdf0e10cSrcweir }
1341cdf0e10cSrcweir 
1342cdf0e10cSrcweir /*--------------------------------------------------------------------
1343cdf0e10cSrcweir 	Beschreibung:
1344cdf0e10cSrcweir  --------------------------------------------------------------------*/
1345cdf0e10cSrcweir 
1346cdf0e10cSrcweir void SwRedlineAcceptDlg::Initialize(const String& rExtraData)
1347cdf0e10cSrcweir {
1348cdf0e10cSrcweir 	if (rExtraData.Len())
1349cdf0e10cSrcweir 	{
1350cdf0e10cSrcweir 		sal_uInt16 nPos = rExtraData.Search(C2S("AcceptChgDat:"));
1351cdf0e10cSrcweir 
1352cdf0e10cSrcweir 		// Versuche, den Alignment-String "ALIGN:(...)" einzulesen; wenn
1353cdf0e10cSrcweir 		// er nicht vorhanden ist, liegt eine "altere Version vor
1354cdf0e10cSrcweir 		if (nPos != STRING_NOTFOUND)
1355cdf0e10cSrcweir 		{
1356cdf0e10cSrcweir 			sal_uInt16 n1 = rExtraData.Search('(', nPos);
1357cdf0e10cSrcweir 			if (n1 != STRING_NOTFOUND)
1358cdf0e10cSrcweir 			{
1359cdf0e10cSrcweir 				sal_uInt16 n2 = rExtraData.Search(')', n1);
1360cdf0e10cSrcweir 				if (n2 != STRING_NOTFOUND)
1361cdf0e10cSrcweir 				{
1362cdf0e10cSrcweir 					// Alignment-String herausschneiden
1363cdf0e10cSrcweir 					String aStr = rExtraData.Copy(nPos, n2 - nPos + 1);
1364cdf0e10cSrcweir 					aStr.Erase(0, n1 - nPos + 1);
1365cdf0e10cSrcweir 
1366cdf0e10cSrcweir 					if (aStr.Len())
1367cdf0e10cSrcweir 					{
1368cdf0e10cSrcweir                         sal_uInt16 nCount = static_cast< sal_uInt16 >(aStr.ToInt32());
1369cdf0e10cSrcweir 
1370cdf0e10cSrcweir 						for (sal_uInt16 i = 0; i < nCount; i++)
1371cdf0e10cSrcweir 						{
1372cdf0e10cSrcweir                             sal_uInt16 n3 = aStr.Search(';');
1373cdf0e10cSrcweir                             aStr.Erase(0, n3 + 1);
1374cdf0e10cSrcweir 							pTable->SetTab(i, aStr.ToInt32(), MAP_PIXEL);
1375cdf0e10cSrcweir 						}
1376cdf0e10cSrcweir 					}
1377cdf0e10cSrcweir 				}
1378cdf0e10cSrcweir 			}
1379cdf0e10cSrcweir 		}
1380cdf0e10cSrcweir 	}
1381cdf0e10cSrcweir }
1382cdf0e10cSrcweir 
1383cdf0e10cSrcweir /*--------------------------------------------------------------------
1384cdf0e10cSrcweir 	Beschreibung:
1385cdf0e10cSrcweir  --------------------------------------------------------------------*/
1386cdf0e10cSrcweir 
1387cdf0e10cSrcweir void SwRedlineAcceptDlg::FillInfo(String &rExtraData) const
1388cdf0e10cSrcweir {
1389cdf0e10cSrcweir 	rExtraData.AppendAscii("AcceptChgDat:(");
1390cdf0e10cSrcweir 
1391cdf0e10cSrcweir 	sal_uInt16	nCount = pTable->TabCount();
1392cdf0e10cSrcweir 
1393cdf0e10cSrcweir 	rExtraData += String::CreateFromInt32(nCount);
1394cdf0e10cSrcweir 	rExtraData += ';';
1395cdf0e10cSrcweir 	for(sal_uInt16 i = 0; i < nCount; i++)
1396cdf0e10cSrcweir 	{
1397cdf0e10cSrcweir 		rExtraData += String::CreateFromInt32( pTable->GetTab(i) );
1398cdf0e10cSrcweir 		rExtraData += ';';
1399cdf0e10cSrcweir 	}
1400cdf0e10cSrcweir 	rExtraData += ')';
1401cdf0e10cSrcweir }
1402