LCOV - code coverage report
Current view: top level - sw/source/uibase/misc - redlndlg.cxx (source / functions) Hit Total Coverage
Test: commit c8344322a7af75b84dd3ca8f78b05543a976dfd5 Lines: 2 665 0.3 %
Date: 2015-06-13 12:38:46 Functions: 4 59 6.8 %
Legend: Lines: hit not hit

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

Generated by: LCOV version 1.11