Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : #include <redline.hxx>
21 : #include <tools/datetime.hxx>
22 : #include <vcl/msgbox.hxx>
23 : #include <svl/eitem.hxx>
24 : #include <sfx2/viewfrm.hxx>
25 : #include <sfx2/dispatch.hxx>
26 : #include <svx/ctredlin.hxx>
27 : #include <svx/postattr.hxx>
28 : #include <swtypes.hxx>
29 : #include <wrtsh.hxx>
30 : #include <view.hxx>
31 : #include <swmodule.hxx>
32 : #include <redlndlg.hxx>
33 : #include <swwait.hxx>
34 : #include <uitool.hxx>
35 :
36 : #include <helpid.h>
37 : #include <cmdid.h>
38 : #include <misc.hrc>
39 : #include <redlndlg.hrc>
40 : #include <shells.hrc>
41 :
42 : // -> #111827#
43 : #include <comcore.hrc>
44 : #include <swundo.hxx>
45 : #include <SwRewriter.hxx>
46 : // <- #111827#
47 :
48 : #include <vector>
49 : #include <svx/svxdlg.hxx>
50 : #include <svx/dialogs.hrc>
51 :
52 : #include <unomid.h>
53 :
54 : #include <docsh.hxx>
55 :
56 : #include <IDocumentRedlineAccess.hxx>
57 : #include <boost/scoped_ptr.hpp>
58 :
59 73350 : SFX_IMPL_MODELESSDIALOG_WITHID( SwRedlineAcceptChild, FN_REDLINE_ACCEPT )
60 :
61 : static sal_uInt16 nSortMode = 0xffff;
62 : static bool bSortDir = true;
63 :
64 0 : SwRedlineAcceptChild::SwRedlineAcceptChild( vcl::Window* _pParent,
65 : sal_uInt16 nId,
66 : SfxBindings* pBindings,
67 : SfxChildWinInfo* pInfo ) :
68 0 : SwChildWinWrapper( _pParent, nId )
69 : {
70 0 : pWindow = new SwModelessRedlineAcceptDlg( pBindings, this, _pParent);
71 :
72 0 : ((SwModelessRedlineAcceptDlg *)pWindow)->Initialize(pInfo);
73 0 : }
74 :
75 : // newly initialise dialog after document switch
76 0 : bool SwRedlineAcceptChild::ReInitDlg(SwDocShell *pDocSh)
77 : {
78 : bool bRet;
79 :
80 0 : if ((bRet = SwChildWinWrapper::ReInitDlg(pDocSh))) // update immediately, doc switch!
81 0 : ((SwModelessRedlineAcceptDlg*)GetWindow())->Activate();
82 :
83 0 : return bRet;
84 : }
85 :
86 0 : SwModelessRedlineAcceptDlg::SwModelessRedlineAcceptDlg(
87 : SfxBindings* _pBindings, SwChildWinWrapper* pChild, vcl::Window *_pParent)
88 : : SfxModelessDialog(_pBindings, pChild, _pParent,
89 : "AcceptRejectChangesDialog", "svx/ui/acceptrejectchangesdialog.ui")
90 0 : , pChildWin (pChild)
91 : {
92 0 : pImplDlg = new SwRedlineAcceptDlg(this);
93 0 : }
94 :
95 0 : void SwModelessRedlineAcceptDlg::Activate()
96 : {
97 0 : SwView *pView = ::GetActiveView();
98 :
99 0 : if (!pView) // can happen when switching to another app, when a Listbox in dialog
100 0 : return; // had the focus previously (actually THs Bug)
101 :
102 0 : SwDocShell *pDocSh = pView->GetDocShell();
103 :
104 0 : if (pChildWin->GetOldDocShell() != pDocSh)
105 : { // doc-switch
106 0 : SwWait aWait( *pDocSh, false );
107 0 : SwWrtShell* pSh = pView->GetWrtShellPtr();
108 :
109 0 : pChildWin->SetOldDocShell(pDocSh); // avoid recursion (using modified-Hdl)
110 :
111 0 : bool bMod = pSh->IsModified();
112 0 : SfxBoolItem aShow(FN_REDLINE_SHOW, true);
113 0 : pSh->GetView().GetViewFrame()->GetDispatcher()->Execute(
114 0 : FN_REDLINE_SHOW, SfxCallMode::SYNCHRON|SfxCallMode::RECORD, &aShow, 0L);
115 0 : if (!bMod)
116 0 : pSh->ResetModified();
117 0 : pImplDlg->Init();
118 :
119 0 : return;
120 : }
121 :
122 0 : pImplDlg->Activate();
123 : }
124 :
125 0 : void SwModelessRedlineAcceptDlg::Initialize(SfxChildWinInfo *pInfo)
126 : {
127 0 : if (pInfo != NULL)
128 0 : pImplDlg->Initialize(pInfo->aExtraString);
129 :
130 0 : SfxModelessDialog::Initialize(pInfo);
131 0 : }
132 :
133 0 : void SwModelessRedlineAcceptDlg::FillInfo(SfxChildWinInfo& rInfo) const
134 : {
135 0 : SfxModelessDialog::FillInfo(rInfo);
136 0 : pImplDlg->FillInfo(rInfo.aExtraString);
137 0 : }
138 :
139 0 : SwModelessRedlineAcceptDlg::~SwModelessRedlineAcceptDlg()
140 : {
141 0 : delete pImplDlg;
142 0 : }
143 :
144 0 : SwRedlineAcceptDlg::SwRedlineAcceptDlg(Dialog *pParent, bool bAutoFmt) :
145 : pParentDlg (pParent),
146 0 : aTabPagesCTRL (pParent->get_content_area()),
147 : aPopup (SW_RES(MN_REDLINE_POPUP)),
148 : sInserted (SW_RES(STR_REDLINE_INSERTED)),
149 : sDeleted (SW_RES(STR_REDLINE_DELETED)),
150 : sFormated (SW_RES(STR_REDLINE_FORMATED)),
151 : sTableChgd (SW_RES(STR_REDLINE_TABLECHG)),
152 : sFmtCollSet (SW_RES(STR_REDLINE_FMTCOLLSET)),
153 : sAutoFormat (SW_RES(STR_REDLINE_AUTOFMT)),
154 : bOnlyFormatedRedlines( false ),
155 : bHasReadonlySel ( false ),
156 : bRedlnAutoFmt (bAutoFmt),
157 0 : bInhibitActivate( false )
158 : {
159 0 : aTabPagesCTRL.SetHelpId(HID_REDLINE_CTRL);
160 0 : pTPView = aTabPagesCTRL.GetViewPage();
161 0 : pTable = pTPView->GetTableControl();
162 :
163 0 : pTPView->InsertWriterHeader();
164 0 : pTPView->SetAcceptClickHdl(LINK(this, SwRedlineAcceptDlg, AcceptHdl));
165 0 : pTPView->SetAcceptAllClickHdl(LINK(this, SwRedlineAcceptDlg, AcceptAllHdl));
166 0 : pTPView->SetRejectClickHdl(LINK(this, SwRedlineAcceptDlg, RejectHdl));
167 0 : pTPView->SetRejectAllClickHdl(LINK(this, SwRedlineAcceptDlg, RejectAllHdl));
168 0 : pTPView->SetUndoClickHdl(LINK(this, SwRedlineAcceptDlg, UndoHdl));
169 :
170 0 : aTabPagesCTRL.GetFilterPage()->SetReadyHdl(LINK(this, SwRedlineAcceptDlg, FilterChangedHdl));
171 :
172 0 : ListBox *pActLB = aTabPagesCTRL.GetFilterPage()->GetLbAction();
173 0 : pActLB->InsertEntry(sInserted);
174 0 : pActLB->InsertEntry(sDeleted);
175 0 : pActLB->InsertEntry(sFormated);
176 0 : pActLB->InsertEntry(sTableChgd);
177 :
178 0 : if (HasRedlineAutoFmt())
179 : {
180 0 : pActLB->InsertEntry(sFmtCollSet);
181 0 : pActLB->InsertEntry(sAutoFormat);
182 0 : pTPView->ShowUndo(true);
183 0 : pTPView->DisableUndo(); // no UNDO events yet
184 : }
185 :
186 0 : pActLB->SelectEntryPos(0);
187 :
188 0 : pTable->SetStyle(pTable->GetStyle()|WB_HASLINES|WB_CLIPCHILDREN|WB_HASBUTTONS|WB_HASBUTTONSATROOT|WB_HSCROLL);
189 0 : pTable->SetNodeDefaultImages();
190 0 : pTable->SetSelectionMode(MULTIPLE_SELECTION);
191 0 : pTable->SetHighlightRange(1);
192 :
193 : static long aStaticTabs[]=
194 : {
195 : 4,10,70,120,170
196 : };
197 :
198 0 : pTable->SetTabs(aStaticTabs);
199 :
200 0 : pTable->SortByCol(nSortMode, bSortDir);
201 :
202 0 : aOldSelectHdl = pTable->GetSelectHdl();
203 0 : aOldDeselectHdl = pTable->GetDeselectHdl();
204 0 : pTable->SetSelectHdl(LINK(this, SwRedlineAcceptDlg, SelectHdl));
205 0 : pTable->SetDeselectHdl(LINK(this, SwRedlineAcceptDlg, DeselectHdl));
206 0 : pTable->SetCommandHdl(LINK(this, SwRedlineAcceptDlg, CommandHdl));
207 :
208 : // avoid flickering of buttons:
209 0 : aDeselectTimer.SetTimeout(100);
210 0 : aDeselectTimer.SetTimeoutHdl(LINK(this, SwRedlineAcceptDlg, SelectHdl));
211 :
212 : // avoid multiple selection of the same texts:
213 0 : aSelectTimer.SetTimeout(100);
214 0 : aSelectTimer.SetTimeoutHdl(LINK(this, SwRedlineAcceptDlg, GotoHdl));
215 0 : }
216 :
217 0 : SwRedlineAcceptDlg::~SwRedlineAcceptDlg()
218 : {
219 0 : }
220 :
221 0 : void SwRedlineAcceptDlg::Init(sal_uInt16 nStart)
222 : {
223 0 : SwWait aWait( *::GetActiveView()->GetDocShell(), false );
224 0 : pTable->SetUpdateMode(false);
225 0 : aUsedSeqNo.clear();
226 :
227 0 : if (nStart)
228 0 : RemoveParents(nStart, aRedlineParents.size() - 1);
229 : else
230 : {
231 0 : pTable->Clear();
232 0 : aRedlineChildren.clear();
233 0 : aRedlineParents.erase(aRedlineParents.begin() + nStart, aRedlineParents.end());
234 : }
235 :
236 : // insert parents
237 0 : InsertParents(nStart);
238 0 : InitAuthors();
239 :
240 0 : pTable->SetUpdateMode(true);
241 : // #i69618# this moves the list box to the right position, visually
242 0 : SvTreeListEntry* pSelEntry = pTable->FirstSelected();
243 0 : if( pSelEntry )
244 0 : pTable->MakeVisible( pSelEntry, true ); //#i70937#, force the scroll
245 0 : }
246 :
247 0 : void SwRedlineAcceptDlg::InitAuthors()
248 : {
249 0 : SwWrtShell* pSh = ::GetActiveView()->GetWrtShellPtr();
250 :
251 0 : SvxTPFilter *pFilterPage = aTabPagesCTRL.GetFilterPage();
252 :
253 0 : std::vector<OUString> aStrings;
254 0 : OUString sOldAuthor(pFilterPage->GetSelectedAuthor());
255 0 : pFilterPage->ClearAuthors();
256 :
257 0 : sal_uInt16 nCount = pSh->GetRedlineCount();
258 :
259 0 : bOnlyFormatedRedlines = true;
260 0 : bHasReadonlySel = false;
261 0 : bool bIsNotFormated = false;
262 : sal_uInt16 i;
263 :
264 : // determine authors
265 0 : for ( i = 0; i < nCount; i++)
266 : {
267 0 : const SwRangeRedline& rRedln = pSh->GetRedline(i);
268 :
269 0 : if( bOnlyFormatedRedlines && nsRedlineType_t::REDLINE_FORMAT != rRedln.GetType() )
270 0 : bOnlyFormatedRedlines = false;
271 :
272 0 : aStrings.push_back(rRedln.GetAuthorString());
273 :
274 0 : for (sal_uInt16 nStack = 1; nStack < rRedln.GetStackCount(); nStack++)
275 : {
276 0 : aStrings.push_back(rRedln.GetAuthorString(nStack));
277 : }
278 : }
279 :
280 0 : std::sort(aStrings.begin(), aStrings.end());
281 0 : aStrings.erase(std::unique(aStrings.begin(), aStrings.end()), aStrings.end());
282 :
283 0 : for (i = 0; i < aStrings.size(); i++)
284 0 : pFilterPage->InsertAuthor(aStrings[i]);
285 :
286 0 : if (pFilterPage->SelectAuthor(sOldAuthor) == LISTBOX_ENTRY_NOTFOUND && !aStrings.empty())
287 0 : pFilterPage->SelectAuthor(aStrings[0]);
288 :
289 0 : bool bEnable = pTable->GetEntryCount() != 0 && !pSh->getIDocumentRedlineAccess()->GetRedlinePassword().getLength();
290 0 : bool bSel = pTable->FirstSelected() != 0;
291 :
292 0 : SvTreeListEntry* pSelEntry = pTable->FirstSelected();
293 0 : while (pSelEntry)
294 : {
295 : // find the selected redline
296 : // (fdo#57874: ignore, if the redline is already gone)
297 0 : sal_uInt16 nPos = GetRedlinePos(*pSelEntry);
298 0 : if( nPos != USHRT_MAX )
299 : {
300 0 : const SwRangeRedline& rRedln = pSh->GetRedline( nPos );
301 :
302 0 : bIsNotFormated |= nsRedlineType_t::REDLINE_FORMAT != rRedln.GetType();
303 : }
304 0 : pSelEntry = pTable->NextSelected(pSelEntry);
305 : }
306 :
307 0 : pTPView->EnableAccept( bEnable && bSel );
308 0 : pTPView->EnableReject( bEnable && bIsNotFormated && bSel );
309 0 : pTPView->EnableAcceptAll( bEnable && !bHasReadonlySel );
310 0 : pTPView->EnableRejectAll( bEnable && !bHasReadonlySel &&
311 0 : !bOnlyFormatedRedlines );
312 0 : }
313 :
314 0 : OUString SwRedlineAcceptDlg::GetRedlineText( const SwRangeRedline& rRedln,
315 : DateTime &rDateTime, sal_uInt16 nStack)
316 : {
317 0 : OUString sEntry(GetActionText(rRedln, nStack));
318 0 : sEntry += "\t";
319 0 : sEntry += rRedln.GetAuthorString(nStack);
320 0 : sEntry += "\t";
321 :
322 0 : const DateTime &rDT = rRedln.GetTimeStamp(nStack);
323 0 : rDateTime = rDT;
324 :
325 0 : sEntry += GetAppLangDateTimeString( rDT );
326 0 : sEntry += "\t";
327 :
328 0 : sEntry += rRedln.GetComment(nStack);
329 :
330 0 : return sEntry;
331 : }
332 :
333 0 : OUString SwRedlineAcceptDlg::GetActionText(const SwRangeRedline& rRedln, sal_uInt16 nStack)
334 : {
335 0 : switch( rRedln.GetType(nStack) )
336 : {
337 0 : case nsRedlineType_t::REDLINE_INSERT: return sInserted;
338 0 : case nsRedlineType_t::REDLINE_DELETE: return sDeleted;
339 0 : case nsRedlineType_t::REDLINE_FORMAT: return sFormated;
340 0 : case nsRedlineType_t::REDLINE_PARAGRAPH_FORMAT: return sFormated;
341 0 : case nsRedlineType_t::REDLINE_TABLE: return sTableChgd;
342 0 : case nsRedlineType_t::REDLINE_FMTCOLL: return sFmtCollSet;
343 : default:;//prevent warning
344 : }
345 :
346 0 : return OUString();
347 : }
348 :
349 : // newly initialise after activation
350 0 : void SwRedlineAcceptDlg::Activate()
351 : {
352 : // prevent update if flag is set (#102547#)
353 0 : if( bInhibitActivate )
354 0 : return;
355 :
356 0 : SwView *pView = ::GetActiveView();
357 :
358 0 : if (!pView) // can happen when switching to another app, when a Listbox in the dialog
359 0 : return; // had the focus previously (actually THs Bug)
360 :
361 0 : SwWait aWait( *pView->GetDocShell(), false );
362 :
363 0 : aUsedSeqNo.clear();
364 :
365 : // did something change?
366 0 : SwWrtShell* pSh = pView->GetWrtShellPtr();
367 0 : sal_uInt16 nCount = pSh->GetRedlineCount();
368 :
369 : // check the number of pointers
370 0 : SwRedlineDataParent *pParent = 0;
371 : sal_uInt16 i;
372 :
373 0 : for ( i = 0; i < nCount; i++)
374 : {
375 0 : const SwRangeRedline& rRedln = pSh->GetRedline(i);
376 :
377 0 : if (i >= aRedlineParents.size())
378 : {
379 : // new entries have been appended
380 0 : Init(i);
381 0 : return;
382 : }
383 :
384 0 : pParent = &aRedlineParents[i];
385 0 : if (&rRedln.GetRedlineData() != pParent->pData)
386 : {
387 : // Redline-Parents were inserted, changed or deleted
388 0 : if ((i = CalcDiff(i, false)) == USHRT_MAX)
389 0 : return;
390 0 : continue;
391 : }
392 :
393 0 : const SwRedlineData *pRedlineData = rRedln.GetRedlineData().Next();
394 0 : const SwRedlineDataChild *pBackupData = pParent->pNext;
395 :
396 0 : if (!pRedlineData && pBackupData)
397 : {
398 : // Redline-Children were deleted
399 0 : if ((i = CalcDiff(i, true)) == USHRT_MAX)
400 0 : return;
401 0 : continue;
402 : }
403 : else
404 : {
405 0 : while (pRedlineData)
406 : {
407 0 : if (pRedlineData != pBackupData->pChild)
408 : {
409 : // Redline-Children were inserted, changed or deleted
410 0 : if ((i = CalcDiff(i, true)) == USHRT_MAX)
411 0 : return;
412 0 : continue;
413 : }
414 0 : pBackupData = pBackupData->pNext;
415 0 : pRedlineData = pRedlineData->Next();
416 : }
417 : }
418 : }
419 :
420 0 : if (nCount != aRedlineParents.size())
421 : {
422 : // Redlines were deleted at the end
423 0 : Init(nCount);
424 0 : return;
425 : }
426 :
427 : // check comment
428 0 : for (i = 0; i < nCount; i++)
429 : {
430 0 : const SwRangeRedline& rRedln = pSh->GetRedline(i);
431 0 : pParent = &aRedlineParents[i];
432 :
433 0 : if(rRedln.GetComment() != pParent->sComment)
434 : {
435 0 : if (pParent->pTLBParent)
436 : {
437 : // update only comment
438 0 : OUString sComment(rRedln.GetComment());
439 0 : pTable->SetEntryText(sComment.replace('\n', ' '), pParent->pTLBParent, 3);
440 : }
441 0 : pParent->sComment = rRedln.GetComment();
442 : }
443 : }
444 :
445 0 : InitAuthors();
446 : }
447 :
448 0 : sal_uInt16 SwRedlineAcceptDlg::CalcDiff(sal_uInt16 nStart, bool bChild)
449 : {
450 0 : if (!nStart)
451 : {
452 0 : Init();
453 0 : return USHRT_MAX;
454 : }
455 :
456 0 : pTable->SetUpdateMode(false);
457 0 : SwView *pView = ::GetActiveView();
458 0 : SwWrtShell* pSh = pView->GetWrtShellPtr();
459 0 : sal_uInt16 nAutoFmt = HasRedlineAutoFmt() ? nsRedlineType_t::REDLINE_FORM_AUTOFMT : 0;
460 0 : SwRedlineDataParent *pParent = &aRedlineParents[nStart];
461 0 : const SwRangeRedline& rRedln = pSh->GetRedline(nStart);
462 :
463 0 : if (bChild) // should actually never happen, but just in case...
464 : {
465 : // throw away all entry's children and initialise newly
466 0 : SwRedlineDataChild* pBackupData = (SwRedlineDataChild*)pParent->pNext;
467 : SwRedlineDataChild* pNext;
468 :
469 0 : while (pBackupData)
470 : {
471 0 : pNext = (SwRedlineDataChild*)pBackupData->pNext;
472 0 : if (pBackupData->pTLBChild)
473 0 : pTable->RemoveEntry(pBackupData->pTLBChild);
474 :
475 0 : for( SwRedlineDataChildArr::iterator it = aRedlineChildren.begin();
476 0 : it != aRedlineChildren.end(); ++it)
477 0 : if (&*it == pBackupData)
478 : {
479 0 : aRedlineChildren.erase(it);
480 0 : break;
481 : }
482 0 : pBackupData = pNext;
483 : }
484 0 : pParent->pNext = 0;
485 :
486 : // insert new children
487 0 : InsertChildren(pParent, rRedln, nAutoFmt);
488 :
489 0 : pTable->SetUpdateMode(true);
490 0 : return nStart;
491 : }
492 :
493 : // have entries been deleted?
494 0 : const SwRedlineData *pRedlineData = &rRedln.GetRedlineData();
495 : sal_uInt16 i;
496 0 : for ( i = nStart + 1; i < aRedlineParents.size(); i++)
497 : {
498 0 : if (aRedlineParents[i].pData == pRedlineData)
499 : {
500 : // remove entries from nStart to i-1
501 0 : RemoveParents(nStart, i - 1);
502 0 : pTable->SetUpdateMode(true);
503 0 : return nStart - 1;
504 : }
505 : }
506 :
507 : // entries been inserted?
508 0 : sal_uInt16 nCount = pSh->GetRedlineCount();
509 0 : pRedlineData = aRedlineParents[nStart].pData;
510 :
511 0 : for (i = nStart + 1; i < nCount; i++)
512 : {
513 0 : if (&pSh->GetRedline(i).GetRedlineData() == pRedlineData)
514 : {
515 : // insert entries from nStart to i-1
516 0 : InsertParents(nStart, i - 1);
517 0 : pTable->SetUpdateMode(true);
518 0 : return nStart - 1;
519 : }
520 : }
521 :
522 0 : pTable->SetUpdateMode(true);
523 0 : Init(nStart); // adjust all entries until the end
524 0 : return USHRT_MAX;
525 : }
526 :
527 0 : void SwRedlineAcceptDlg::InsertChildren(SwRedlineDataParent *pParent, const SwRangeRedline& rRedln, const sal_uInt16 nAutoFmt)
528 : {
529 0 : OUString sChild;
530 0 : SwRedlineDataChild *pLastRedlineChild = 0;
531 0 : const SwRedlineData *pRedlineData = &rRedln.GetRedlineData();
532 0 : bool bAutoFmt = (rRedln.GetRealType() & nAutoFmt) != 0;
533 :
534 0 : OUString sAction = GetActionText(rRedln);
535 0 : bool bValidParent = sFilterAction.isEmpty() || sFilterAction == sAction;
536 0 : bValidParent = bValidParent && pTable->IsValidEntry(rRedln.GetAuthorString(), rRedln.GetTimeStamp(), rRedln.GetComment());
537 0 : if (nAutoFmt)
538 : {
539 :
540 0 : if (pParent->pData->GetSeqNo())
541 : {
542 : std::pair<SwRedlineDataParentSortArr::const_iterator,bool> const ret
543 0 : = aUsedSeqNo.insert(pParent);
544 0 : if (ret.second) // already there
545 : {
546 0 : if (pParent->pTLBParent)
547 : {
548 : pTable->SetEntryText(
549 0 : sAutoFormat, (*ret.first)->pTLBParent, 0);
550 0 : pTable->RemoveEntry(pParent->pTLBParent);
551 0 : pParent->pTLBParent = 0;
552 : }
553 0 : return;
554 : }
555 : }
556 0 : bValidParent = bValidParent && bAutoFmt;
557 : }
558 0 : bool bValidTree = bValidParent;
559 :
560 0 : for (sal_uInt16 nStack = 1; nStack < rRedln.GetStackCount(); nStack++)
561 : {
562 0 : pRedlineData = pRedlineData->Next();
563 :
564 0 : SwRedlineDataChildPtr pRedlineChild = new SwRedlineDataChild;
565 0 : pRedlineChild->pChild = pRedlineData;
566 0 : aRedlineChildren.push_back(pRedlineChild);
567 :
568 0 : if ( pLastRedlineChild )
569 0 : pLastRedlineChild->pNext = pRedlineChild;
570 : else
571 0 : pParent->pNext = pRedlineChild;
572 :
573 0 : sAction = GetActionText(rRedln, nStack);
574 0 : bool bValidChild = sFilterAction.isEmpty() || sFilterAction == sAction;
575 0 : bValidChild = bValidChild && pTable->IsValidEntry(rRedln.GetAuthorString(nStack), rRedln.GetTimeStamp(nStack), rRedln.GetComment());
576 0 : if (nAutoFmt)
577 0 : bValidChild = bValidChild && bAutoFmt;
578 0 : bValidTree |= bValidChild;
579 :
580 0 : if (bValidChild)
581 : {
582 0 : RedlinData *pData = new RedlinData;
583 0 : pData->pData = pRedlineChild;
584 0 : pData->bDisabled = true;
585 0 : sChild = GetRedlineText(rRedln, pData->aDateTime, nStack);
586 :
587 0 : SvTreeListEntry* pChild = pTable->InsertEntry(sChild, pData, pParent->pTLBParent);
588 :
589 0 : pRedlineChild->pTLBChild = pChild;
590 0 : if (!bValidParent)
591 0 : pTable->Expand(pParent->pTLBParent);
592 : }
593 : else
594 0 : pRedlineChild->pTLBChild = 0;
595 :
596 0 : pLastRedlineChild = pRedlineChild;
597 : }
598 :
599 0 : if (pLastRedlineChild)
600 0 : pLastRedlineChild->pNext = 0;
601 :
602 0 : if (!bValidTree && pParent->pTLBParent)
603 : {
604 0 : pTable->RemoveEntry(pParent->pTLBParent);
605 0 : pParent->pTLBParent = 0;
606 0 : if (nAutoFmt)
607 0 : aUsedSeqNo.erase(pParent);
608 0 : }
609 : }
610 :
611 0 : void SwRedlineAcceptDlg::RemoveParents(sal_uInt16 nStart, sal_uInt16 nEnd)
612 : {
613 0 : SwWrtShell* pSh = ::GetActiveView()->GetWrtShellPtr();
614 0 : sal_uInt16 nCount = pSh->GetRedlineCount();
615 :
616 0 : SvLBoxEntryArr aLBoxArr;
617 :
618 : // because of Bug of TLB that ALWAYS calls the SelectHandler at Remove:
619 0 : pTable->SetSelectHdl(aOldSelectHdl);
620 0 : pTable->SetDeselectHdl(aOldDeselectHdl);
621 0 : bool bChildrenRemoved = false;
622 0 : pTable->SelectAll(false);
623 :
624 : // set the cursor after the last entry because otherwise performance problem in TLB.
625 : // TLB would otherwise reset the cursor at every Remove (expensive)
626 0 : sal_uInt16 nPos = std::min((sal_uInt16)nCount, (sal_uInt16)aRedlineParents.size());
627 0 : SvTreeListEntry *pCurEntry = NULL;
628 0 : while( ( pCurEntry == NULL ) && ( nPos > 0 ) )
629 : {
630 0 : --nPos;
631 0 : pCurEntry = aRedlineParents[nPos].pTLBParent;
632 : }
633 :
634 0 : if (pCurEntry)
635 0 : pTable->SetCurEntry(pCurEntry);
636 :
637 0 : SvTreeList* pModel = pTable->GetModel();
638 :
639 0 : for (sal_uInt16 i = nStart; i <= nEnd; i++)
640 : {
641 0 : if (!bChildrenRemoved && aRedlineParents[i].pNext)
642 : {
643 0 : SwRedlineDataChildPtr pChildPtr = (SwRedlineDataChildPtr)aRedlineParents[i].pNext;
644 0 : for( SwRedlineDataChildArr::iterator it = aRedlineChildren.begin();
645 0 : it != aRedlineChildren.end(); ++it)
646 0 : if (&*it == pChildPtr)
647 : {
648 0 : sal_uInt16 nChildren = 0;
649 0 : while (pChildPtr)
650 : {
651 0 : pChildPtr = (SwRedlineDataChildPtr)pChildPtr->pNext;
652 0 : nChildren++;
653 : }
654 :
655 0 : aRedlineChildren.erase(it, it + nChildren);
656 0 : bChildrenRemoved = true;
657 0 : break;
658 : }
659 : }
660 0 : SvTreeListEntry *pEntry = aRedlineParents[i].pTLBParent;
661 0 : if (pEntry)
662 : {
663 0 : long nIdx = aLBoxArr.size() - 1L;
664 0 : sal_uLong nAbsPos = pModel->GetAbsPos(pEntry);
665 0 : while (nIdx >= 0 &&
666 0 : pModel->GetAbsPos(aLBoxArr[ static_cast< sal_uInt16 >(nIdx) ]) > nAbsPos)
667 0 : nIdx--;
668 0 : aLBoxArr.insert( aLBoxArr.begin() + static_cast< sal_uInt16 >(++nIdx) , pEntry);
669 : }
670 : }
671 :
672 : // clear TLB from behind
673 0 : long nIdx = (long)aLBoxArr.size() - 1L;
674 0 : while (nIdx >= 0)
675 0 : pTable->RemoveEntry(aLBoxArr[ static_cast< sal_uInt16 >(nIdx--) ]);
676 :
677 0 : pTable->SetSelectHdl(LINK(this, SwRedlineAcceptDlg, SelectHdl));
678 0 : pTable->SetDeselectHdl(LINK(this, SwRedlineAcceptDlg, DeselectHdl));
679 : // unfortunately by Remove it was selected from the TLB always again ...
680 0 : pTable->SelectAll(false);
681 :
682 0 : aRedlineParents.erase( aRedlineParents.begin() + nStart, aRedlineParents.begin() + nEnd + 1);
683 0 : }
684 :
685 0 : void SwRedlineAcceptDlg::InsertParents(sal_uInt16 nStart, sal_uInt16 nEnd)
686 : {
687 0 : SwView *pView = ::GetActiveView();
688 0 : SwWrtShell* pSh = pView->GetWrtShellPtr();
689 0 : sal_uInt16 nAutoFmt = HasRedlineAutoFmt() ? nsRedlineType_t::REDLINE_FORM_AUTOFMT : 0;
690 :
691 0 : OUString sParent;
692 0 : sal_uInt16 nCount = pSh->GetRedlineCount();
693 0 : nEnd = std::min((sal_uInt16)nEnd, (sal_uInt16)(nCount - 1)); // also treats nEnd=USHRT_MAX (until the end)
694 :
695 0 : if (nEnd == USHRT_MAX)
696 0 : return; // no redlines in the document
697 :
698 : RedlinData *pData;
699 : SvTreeListEntry *pParent;
700 : SwRedlineDataParent* pRedlineParent;
701 : const SwRangeRedline* pCurrRedline;
702 0 : if( !nStart && !pTable->FirstSelected() )
703 : {
704 0 : pCurrRedline = pSh->GetCurrRedline();
705 0 : if( !pCurrRedline )
706 : {
707 0 : pSh->SwCrsrShell::Push();
708 0 : if( 0 == (pCurrRedline = pSh->SelNextRedline()))
709 0 : pCurrRedline = pSh->SelPrevRedline();
710 0 : pSh->SwCrsrShell::Pop( false );
711 : }
712 : }
713 : else
714 0 : pCurrRedline = 0;
715 :
716 0 : for (sal_uInt16 i = nStart; i <= nEnd; i++)
717 : {
718 0 : const SwRangeRedline& rRedln = pSh->GetRedline(i);
719 0 : const SwRedlineData *pRedlineData = &rRedln.GetRedlineData();
720 :
721 0 : pRedlineParent = new SwRedlineDataParent;
722 0 : pRedlineParent->pData = pRedlineData;
723 0 : pRedlineParent->pNext = 0;
724 0 : OUString sComment(rRedln.GetComment());
725 0 : pRedlineParent->sComment = sComment.replace('\n', ' ');
726 0 : aRedlineParents.insert(aRedlineParents.begin() + i, pRedlineParent);
727 :
728 0 : pData = new RedlinData;
729 0 : pData->pData = pRedlineParent;
730 0 : pData->bDisabled = false;
731 :
732 0 : sParent = GetRedlineText(rRedln, pData->aDateTime);
733 0 : pParent = pTable->InsertEntry(sParent, pData, 0, i);
734 0 : if( pCurrRedline == &rRedln )
735 : {
736 0 : pTable->SetCurEntry( pParent );
737 0 : pTable->Select( pParent );
738 0 : pTable->MakeVisible( pParent );
739 : }
740 :
741 0 : pRedlineParent->pTLBParent = pParent;
742 :
743 0 : InsertChildren(pRedlineParent, rRedln, nAutoFmt);
744 0 : }
745 : }
746 :
747 0 : void SwRedlineAcceptDlg::CallAcceptReject( bool bSelect, bool bAccept )
748 : {
749 0 : SwWrtShell* pSh = ::GetActiveView()->GetWrtShellPtr();
750 0 : SvTreeListEntry* pEntry = bSelect ? pTable->FirstSelected() : pTable->First();
751 0 : sal_uLong nPos = LONG_MAX;
752 :
753 : typedef std::vector<SvTreeListEntry*> ListBoxEntries_t;
754 0 : ListBoxEntries_t aRedlines;
755 :
756 : // don't activate
757 : OSL_ENSURE( bInhibitActivate == false,
758 : "recursive call of CallAcceptReject?");
759 0 : bInhibitActivate = true;
760 :
761 : // collect redlines-to-be-accepted/rejected in aRedlines vector
762 0 : while( pEntry )
763 : {
764 0 : if( !pTable->GetParent( pEntry ) )
765 : {
766 0 : if( bSelect && LONG_MAX == nPos )
767 0 : nPos = pTable->GetModel()->GetAbsPos( pEntry );
768 :
769 0 : RedlinData *pData = (RedlinData *)pEntry->GetUserData();
770 :
771 0 : if( !pData->bDisabled )
772 0 : aRedlines.push_back( pEntry );
773 : }
774 :
775 0 : pEntry = bSelect ? pTable->NextSelected(pEntry) : pTable->Next(pEntry);
776 : }
777 :
778 0 : bool (SwEditShell:: *FnAccRej)( sal_uInt16 ) = &SwEditShell::AcceptRedline;
779 0 : if( !bAccept )
780 0 : FnAccRej = &SwEditShell::RejectRedline;
781 :
782 0 : SwWait aWait( *pSh->GetView().GetDocShell(), true );
783 0 : pSh->StartAction();
784 :
785 : // #111827#
786 0 : if (aRedlines.size() > 1)
787 : {
788 0 : OUString aTmpStr;
789 : {
790 0 : SwRewriter aRewriter;
791 : aRewriter.AddRule(UndoArg1,
792 0 : OUString::number(aRedlines.size()));
793 0 : aTmpStr = aRewriter.Apply(OUString(SW_RES(STR_N_REDLINES)));
794 : }
795 :
796 0 : SwRewriter aRewriter;
797 0 : aRewriter.AddRule(UndoArg1, aTmpStr);
798 :
799 : pSh->StartUndo(bAccept? UNDO_ACCEPT_REDLINE : UNDO_REJECT_REDLINE,
800 0 : &aRewriter);
801 : }
802 :
803 : // accept/reject the redlines in aRedlines. The absolute
804 : // position may change during the process (e.g. when two redlines
805 : // are merged in result of another one being deleted), so the
806 : // position must be resolved late and checked before using it.
807 : // (cf #102547#)
808 0 : ListBoxEntries_t::iterator aEnd = aRedlines.end();
809 0 : for( ListBoxEntries_t::iterator aIter = aRedlines.begin();
810 : aIter != aEnd;
811 : ++aIter )
812 : {
813 0 : sal_uInt16 nPosition = GetRedlinePos( **aIter );
814 0 : if( nPosition != USHRT_MAX )
815 0 : (pSh->*FnAccRej)( nPosition );
816 : }
817 :
818 : // #111827#
819 0 : if (aRedlines.size() > 1)
820 : {
821 0 : pSh->EndUndo();
822 : }
823 :
824 0 : pSh->EndAction();
825 :
826 0 : bInhibitActivate = false;
827 0 : Activate();
828 :
829 0 : if( ULONG_MAX != nPos && pTable->GetEntryCount() )
830 : {
831 0 : if( nPos >= pTable->GetEntryCount() )
832 0 : nPos = pTable->GetEntryCount() - 1;
833 0 : pEntry = pTable->GetEntryAtAbsPos( nPos );
834 0 : if( !pEntry && nPos-- )
835 0 : pEntry = pTable->GetEntryAtAbsPos( nPos );
836 0 : if( pEntry )
837 : {
838 0 : pTable->Select( pEntry );
839 0 : pTable->MakeVisible( pEntry );
840 0 : pTable->SetCurEntry(pEntry);
841 : }
842 : }
843 0 : pTPView->EnableUndo();
844 0 : }
845 :
846 0 : sal_uInt16 SwRedlineAcceptDlg::GetRedlinePos( const SvTreeListEntry& rEntry ) const
847 : {
848 0 : SwWrtShell* pSh = ::GetActiveView()->GetWrtShellPtr();
849 : return pSh->FindRedlineOfData( *((SwRedlineDataParent*)((RedlinData *)
850 0 : rEntry.GetUserData())->pData)->pData );
851 : }
852 :
853 0 : IMPL_LINK_NOARG(SwRedlineAcceptDlg, AcceptHdl)
854 : {
855 0 : CallAcceptReject( true, true );
856 0 : return 0;
857 : }
858 :
859 0 : IMPL_LINK_NOARG(SwRedlineAcceptDlg, AcceptAllHdl)
860 : {
861 0 : CallAcceptReject( false, true );
862 0 : return 0;
863 : }
864 :
865 0 : IMPL_LINK_NOARG(SwRedlineAcceptDlg, RejectHdl)
866 : {
867 0 : CallAcceptReject( true, false );
868 0 : return 0;
869 : }
870 :
871 0 : IMPL_LINK_NOARG(SwRedlineAcceptDlg, RejectAllHdl)
872 : {
873 0 : CallAcceptReject( false, false );
874 0 : return 0;
875 : }
876 :
877 0 : IMPL_LINK_NOARG(SwRedlineAcceptDlg, UndoHdl)
878 : {
879 0 : SwView * pView = ::GetActiveView();
880 : pView->GetViewFrame()->GetDispatcher()->
881 0 : Execute(SID_UNDO, SfxCallMode::SYNCHRON);
882 0 : pTPView->EnableUndo(pView->GetSlotState(SID_UNDO) != 0);
883 :
884 0 : Activate();
885 :
886 0 : return 0;
887 : }
888 :
889 0 : IMPL_LINK_NOARG(SwRedlineAcceptDlg, FilterChangedHdl)
890 : {
891 0 : SvxTPFilter *pFilterTP = aTabPagesCTRL.GetFilterPage();
892 :
893 0 : if (pFilterTP->IsAction())
894 0 : sFilterAction = pFilterTP->GetLbAction()->GetSelectEntry();
895 : else
896 0 : sFilterAction = aEmptyOUStr;
897 :
898 0 : Init();
899 :
900 0 : return 0;
901 : }
902 :
903 0 : IMPL_LINK_NOARG(SwRedlineAcceptDlg, DeselectHdl)
904 : {
905 : // avoid flickering of buttons:
906 0 : aDeselectTimer.Start();
907 :
908 0 : return 0;
909 : }
910 :
911 0 : IMPL_LINK_NOARG(SwRedlineAcceptDlg, SelectHdl)
912 : {
913 0 : aDeselectTimer.Stop();
914 0 : aSelectTimer.Start();
915 :
916 0 : return 0;
917 : }
918 :
919 0 : IMPL_LINK_NOARG(SwRedlineAcceptDlg, GotoHdl)
920 : {
921 0 : SwWrtShell* pSh = ::GetActiveView()->GetWrtShellPtr();
922 0 : aSelectTimer.Stop();
923 :
924 0 : bool bIsNotFormated = false;
925 0 : bool bSel = false;
926 :
927 : //#98883# don't select redlines while the dialog is not focussed
928 : //#107938# But not only ask pTable if it has the focus. To move
929 : // the selection to the selected redline any child of pParentDlg
930 : // may the focus.
931 0 : SvTreeListEntry* pSelEntry = 0;
932 :
933 0 : if (pParentDlg->HasChildPathFocus())
934 0 : pSelEntry = pTable->FirstSelected();
935 :
936 0 : if( pSelEntry )
937 : {
938 0 : SvTreeListEntry* pActEntry = pSelEntry;
939 0 : pSh->StartAction();
940 0 : pSh->EnterStdMode();
941 0 : SwViewShell::SetCareWin(pParentDlg);
942 :
943 0 : while (pSelEntry)
944 : {
945 0 : if (pTable->GetParent(pSelEntry))
946 : {
947 0 : pActEntry = pTable->GetParent(pSelEntry);
948 :
949 0 : if (pTable->IsSelected(pActEntry))
950 : {
951 0 : pSelEntry = pActEntry = pTable->NextSelected(pSelEntry);
952 0 : continue; // don't select twice
953 : }
954 : }
955 : else
956 0 : bSel = true;
957 :
958 : // #98864# find the selected redline (ignore, if the redline is already gone)
959 0 : sal_uInt16 nPos = GetRedlinePos(*pActEntry);
960 0 : if( nPos != USHRT_MAX )
961 : {
962 :
963 0 : const SwRangeRedline& rRedln = pSh->GetRedline( nPos );
964 0 : bIsNotFormated |= nsRedlineType_t::REDLINE_FORMAT != rRedln.GetType();
965 :
966 0 : if (pSh->GotoRedline(nPos, true))
967 : {
968 0 : pSh->SetInSelect();
969 0 : pSh->EnterAddMode();
970 : }
971 : }
972 :
973 0 : pSelEntry = pActEntry = pTable->NextSelected(pSelEntry);
974 : }
975 :
976 0 : pSh->LeaveAddMode();
977 0 : pSh->EndAction();
978 0 : SwViewShell::SetCareWin(NULL);
979 : }
980 0 : bool bEnable = !pSh->getIDocumentRedlineAccess()->GetRedlinePassword().getLength();
981 0 : pTPView->EnableAccept( bEnable && bSel /*&& !bReadonlySel*/ );
982 0 : pTPView->EnableReject( bEnable && bSel && bIsNotFormated /*&& !bReadonlySel*/ );
983 0 : pTPView->EnableRejectAll( bEnable && !bOnlyFormatedRedlines && !bHasReadonlySel );
984 :
985 0 : return 0;
986 : }
987 :
988 0 : IMPL_LINK_NOARG(SwRedlineAcceptDlg, CommandHdl)
989 : {
990 0 : const CommandEvent aCEvt(pTable->GetCommandEvent());
991 :
992 0 : switch ( aCEvt.GetCommand() )
993 : {
994 : case COMMAND_CONTEXTMENU:
995 : {
996 0 : SwWrtShell* pSh = ::GetActiveView()->GetWrtShellPtr();
997 0 : SvTreeListEntry* pEntry = pTable->FirstSelected();
998 0 : const SwRangeRedline *pRed = 0;
999 :
1000 0 : if (pEntry)
1001 : {
1002 0 : SvTreeListEntry* pTopEntry = pEntry;
1003 :
1004 0 : if (pTable->GetParent(pEntry))
1005 0 : pTopEntry = pTable->GetParent(pEntry);
1006 :
1007 0 : sal_uInt16 nPos = GetRedlinePos(*pTopEntry);
1008 :
1009 : // disable commenting for protected areas
1010 0 : if (nPos != USHRT_MAX && (pRed = pSh->GotoRedline(nPos, true)) != 0)
1011 : {
1012 0 : if( pSh->IsCrsrPtAtEnd() )
1013 0 : pSh->SwapPam();
1014 0 : pSh->SetInSelect();
1015 : }
1016 : }
1017 :
1018 0 : aPopup.EnableItem( MN_EDIT_COMMENT, pEntry && pRed &&
1019 0 : !pTable->GetParent(pEntry) &&
1020 0 : !pTable->NextSelected(pEntry)
1021 : //JP 27.9.2001: make no sense if we handle readonly sections
1022 : // && pRed->HasReadonlySel()
1023 0 : );
1024 :
1025 0 : aPopup.EnableItem( MN_SUB_SORT, pTable->First() != 0 );
1026 0 : sal_uInt16 nColumn = pTable->GetSortedCol();
1027 0 : if (nColumn == 0xffff)
1028 0 : nColumn = 4;
1029 :
1030 0 : PopupMenu *pSubMenu = aPopup.GetPopupMenu(MN_SUB_SORT);
1031 0 : if (pSubMenu)
1032 : {
1033 0 : for (sal_uInt16 i = MN_SORT_ACTION; i < MN_SORT_ACTION + 5; i++)
1034 0 : pSubMenu->CheckItem(i, false);
1035 :
1036 0 : pSubMenu->CheckItem(nColumn + MN_SORT_ACTION);
1037 : }
1038 :
1039 0 : sal_uInt16 nRet = aPopup.Execute(pTable, aCEvt.GetMousePosPixel());
1040 :
1041 0 : switch( nRet )
1042 : {
1043 : case MN_EDIT_COMMENT:
1044 : {
1045 0 : if (pEntry)
1046 : {
1047 0 : if (pTable->GetParent(pEntry))
1048 0 : pEntry = pTable->GetParent(pEntry);
1049 :
1050 0 : sal_uInt16 nPos = GetRedlinePos(*pEntry);
1051 :
1052 0 : if (nPos == USHRT_MAX)
1053 0 : break;
1054 :
1055 0 : const SwRangeRedline &rRedline = pSh->GetRedline(nPos);
1056 :
1057 : /* enable again once we have redline comments in the margin
1058 : sComment = rRedline.GetComment();
1059 : if ( !sComment.Len() )
1060 : GetActiveView()->GetDocShell()->Broadcast(SwRedlineHint(&rRedline,SWREDLINE_INSERTED));
1061 : const_cast<SwRangeRedline&>(rRedline).Broadcast(SwRedlineHint(&rRedline,SWREDLINE_FOCUS));
1062 : */
1063 :
1064 0 : OUString sComment = convertLineEnd(rRedline.GetComment(), GetSystemLineEnd());
1065 0 : SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
1066 : OSL_ENSURE(pFact, "Dialog creation failed!");
1067 0 : ::DialogGetRanges fnGetRange = pFact->GetDialogGetRangesFunc();
1068 : OSL_ENSURE(fnGetRange, "Dialog creation failed! GetRanges()");
1069 0 : SfxItemSet aSet( pSh->GetAttrPool(), fnGetRange() );
1070 :
1071 0 : aSet.Put(SvxPostItTextItem(sComment, SID_ATTR_POSTIT_TEXT));
1072 0 : aSet.Put(SvxPostItAuthorItem(rRedline.GetAuthorString(), SID_ATTR_POSTIT_AUTHOR));
1073 :
1074 : aSet.Put(SvxPostItDateItem( GetAppLangDateTimeString(
1075 0 : rRedline.GetRedlineData().GetTimeStamp() ),
1076 0 : SID_ATTR_POSTIT_DATE ));
1077 :
1078 0 : boost::scoped_ptr<AbstractSvxPostItDialog> pDlg(pFact->CreateSvxPostItDialog( pParentDlg, aSet, false ));
1079 : OSL_ENSURE(pDlg, "Dialog creation failed!");
1080 :
1081 0 : pDlg->HideAuthor();
1082 :
1083 0 : sal_uInt16 nResId = 0;
1084 0 : switch( rRedline.GetType() )
1085 : {
1086 : case nsRedlineType_t::REDLINE_INSERT:
1087 0 : nResId = STR_REDLINE_INSERTED;
1088 0 : break;
1089 : case nsRedlineType_t::REDLINE_DELETE:
1090 0 : nResId = STR_REDLINE_DELETED;
1091 0 : break;
1092 : case nsRedlineType_t::REDLINE_FORMAT:
1093 : case nsRedlineType_t::REDLINE_PARAGRAPH_FORMAT:
1094 0 : nResId = STR_REDLINE_FORMATED;
1095 0 : break;
1096 : case nsRedlineType_t::REDLINE_TABLE:
1097 0 : nResId = STR_REDLINE_TABLECHG;
1098 0 : break;
1099 : default:;//prevent warning
1100 : }
1101 0 : OUString sTitle(SW_RES(STR_REDLINE_COMMENT));
1102 0 : if( nResId )
1103 0 : sTitle += SW_RESSTR( nResId );
1104 0 : pDlg->SetText(sTitle);
1105 :
1106 0 : SwViewShell::SetCareWin(pDlg->GetWindow());
1107 :
1108 0 : if ( pDlg->Execute() == RET_OK )
1109 : {
1110 0 : const SfxItemSet* pOutSet = pDlg->GetOutputItemSet();
1111 0 : OUString sMsg(((const SvxPostItTextItem&)pOutSet->Get(SID_ATTR_POSTIT_TEXT)).GetValue());
1112 :
1113 : // insert / change comment
1114 0 : pSh->SetRedlineComment(sMsg);
1115 0 : pTable->SetEntryText(sMsg.replace('\n', ' '), pEntry, 3);
1116 : }
1117 :
1118 0 : pDlg.reset();
1119 0 : SwViewShell::SetCareWin(NULL);
1120 : }
1121 :
1122 : }
1123 0 : break;
1124 :
1125 : case MN_SORT_ACTION:
1126 : case MN_SORT_AUTHOR:
1127 : case MN_SORT_DATE:
1128 : case MN_SORT_COMMENT:
1129 : case MN_SORT_POSITION:
1130 : {
1131 0 : bSortDir = true;
1132 0 : if (nRet - MN_SORT_ACTION == 4 && pTable->GetSortedCol() == 0xffff)
1133 0 : break; // we already have it
1134 :
1135 0 : nSortMode = nRet - MN_SORT_ACTION;
1136 0 : if (nSortMode == 4)
1137 0 : nSortMode = 0xffff; // unsorted / sorted by position
1138 :
1139 0 : if (pTable->GetSortedCol() == nSortMode)
1140 0 : bSortDir = !pTable->GetSortDirection();
1141 :
1142 0 : SwWait aWait( *::GetActiveView()->GetDocShell(), false );
1143 0 : pTable->SortByCol(nSortMode, bSortDir);
1144 0 : if (nSortMode == 0xffff)
1145 0 : Init(); // newly fill everything
1146 : }
1147 0 : break;
1148 : }
1149 : }
1150 0 : break;
1151 : }
1152 :
1153 0 : return 0;
1154 : }
1155 :
1156 0 : void SwRedlineAcceptDlg::Initialize(const OUString& rExtraData)
1157 : {
1158 0 : if (!rExtraData.isEmpty())
1159 : {
1160 0 : sal_Int32 nPos = rExtraData.indexOf("AcceptChgDat:");
1161 :
1162 : // try to read the alignment string "ALIGN:(...)"; if none existing,
1163 : // it's an old version
1164 0 : if (nPos != -1)
1165 : {
1166 0 : sal_Int32 n1 = rExtraData.indexOf('(', nPos);
1167 0 : if (n1 != -1)
1168 : {
1169 0 : sal_Int32 n2 = rExtraData.indexOf(')', n1);
1170 0 : if (n2 != -1)
1171 : {
1172 : // cut out the alignment string
1173 0 : OUString aStr = rExtraData.copy(nPos, n2 - nPos + 1);
1174 0 : aStr = aStr.copy(n1 - nPos + 1);
1175 :
1176 0 : if (!aStr.isEmpty())
1177 : {
1178 0 : sal_uInt16 nCount = static_cast< sal_uInt16 >(aStr.toInt32());
1179 :
1180 0 : for (sal_uInt16 i = 0; i < nCount; i++)
1181 : {
1182 0 : sal_Int32 n3 = aStr.indexOf(';');
1183 0 : aStr = aStr.copy(n3 + 1);
1184 0 : pTable->SetTab(i, aStr.toInt32(), MAP_PIXEL);
1185 : }
1186 0 : }
1187 : }
1188 : }
1189 : }
1190 : }
1191 0 : }
1192 :
1193 0 : void SwRedlineAcceptDlg::FillInfo(OUString &rExtraData) const
1194 : {
1195 0 : rExtraData += "AcceptChgDat:(";
1196 :
1197 0 : sal_uInt16 nCount = pTable->TabCount();
1198 :
1199 0 : rExtraData += OUString::number(nCount);
1200 0 : rExtraData += ";";
1201 0 : for(sal_uInt16 i = 0; i < nCount; i++)
1202 : {
1203 0 : rExtraData += OUString::number( pTable->GetTab(i) );
1204 0 : rExtraData += ";";
1205 : }
1206 0 : rExtraData += ")";
1207 270 : }
1208 :
1209 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|