LCOV - code coverage report
Current view: top level - sc/source/ui/miscdlgs - acredlin.cxx (source / functions) Hit Total Coverage
Test: commit 10e77ab3ff6f4314137acd6e2702a6e5c1ce1fae Lines: 1 1064 0.1 %
Date: 2014-11-03 Functions: 2 62 3.2 %
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 <comphelper/string.hxx>
      21             : #include <svl/undo.hxx>
      22             : #include <unotools/textsearch.hxx>
      23             : #include <unotools/localedatawrapper.hxx>
      24             : #include <unotools/collatorwrapper.hxx>
      25             : #include <vcl/msgbox.hxx>
      26             : #include <sfx2/app.hxx>
      27             : #include <sfx2/viewfrm.hxx>
      28             : 
      29             : #include "acredlin.hxx"
      30             : #include "global.hxx"
      31             : #include "reffact.hxx"
      32             : #include "document.hxx"
      33             : #include "docsh.hxx"
      34             : #include "scresid.hxx"
      35             : #include "globstr.hrc"
      36             : #include "acredlin.hrc"
      37             : #include "simpref.hxx"
      38             : #include "scmod.hxx"
      39             : #include "popmenu.hxx"
      40             : #include "tabvwsh.hxx"
      41             : 
      42             : // defines -------------------------------------------------------------------
      43             : 
      44             : #define ABS_SREF          SCA_VALID \
      45             :                         | SCA_COL_ABSOLUTE | SCA_ROW_ABSOLUTE | SCA_TAB_ABSOLUTE
      46             : #define ABS_DREF          ABS_SREF \
      47             :                         | SCA_COL2_ABSOLUTE | SCA_ROW2_ABSOLUTE | SCA_TAB2_ABSOLUTE
      48             : #define ABS_DREF3D      ABS_DREF | SCA_TAB_3D
      49             : 
      50             : #define RD_SPECIAL_NONE         0
      51             : #define RD_SPECIAL_CONTENT      1
      52             : #define RD_SPECIAL_VISCONTENT   2
      53             : 
      54             : //  class ScRedlinData
      55             : 
      56           0 : ScRedlinData::ScRedlinData()
      57           0 :     :RedlinData()
      58             : {
      59           0 :     nInfo=RD_SPECIAL_NONE;
      60           0 :     nActionNo=0;
      61           0 :     pData=NULL;
      62           0 :     bDisabled=false;
      63           0 :     bIsRejectable=false;
      64           0 :     bIsAcceptable=false;
      65           0 :     nTable=SCTAB_MAX;
      66           0 :     nCol=SCCOL_MAX;
      67           0 :     nRow=SCROW_MAX;
      68           0 : }
      69             : 
      70           0 : ScRedlinData::~ScRedlinData()
      71             : {
      72           0 :     nInfo=RD_SPECIAL_NONE;
      73           0 :     nActionNo=0;
      74           0 :     pData=NULL;
      75           0 :     bDisabled=false;
      76           0 :     bIsRejectable=false;
      77           0 :     bIsAcceptable=false;
      78           0 : }
      79             : 
      80             : //  class ScAcceptChgDlg
      81             : 
      82           0 : ScAcceptChgDlg::ScAcceptChgDlg(SfxBindings* pB, SfxChildWindow* pCW, vcl::Window* pParent,
      83             :     ScViewData* ptrViewData)
      84             :     : SfxModelessDialog(pB, pCW, pParent,
      85             :         "AcceptRejectChangesDialog", "svx/ui/acceptrejectchangesdialog.ui"),
      86             :         pViewData       ( ptrViewData ),
      87           0 :         pDoc            ( ptrViewData->GetDocument() ),
      88           0 :         aLocalRangeName ( *(pDoc->GetRangeName()) ),
      89             :         aStrInsertCols       (SC_RESSTR(STR_CHG_INSERT_COLS)),
      90             :         aStrInsertRows       (SC_RESSTR(STR_CHG_INSERT_ROWS)),
      91             :         aStrInsertTabs       (SC_RESSTR(STR_CHG_INSERT_TABS)),
      92             :         aStrDeleteCols       (SC_RESSTR(STR_CHG_DELETE_COLS)),
      93             :         aStrDeleteRows       (SC_RESSTR(STR_CHG_DELETE_ROWS)),
      94             :         aStrDeleteTabs       (SC_RESSTR(STR_CHG_DELETE_TABS)),
      95             :         aStrMove             (SC_RESSTR(STR_CHG_MOVE)),
      96             :         aStrContent          (SC_RESSTR(STR_CHG_CONTENT)),
      97             :         aStrReject           (SC_RESSTR(STR_CHG_REJECT)),
      98             :         aStrAllAccepted      (SC_RESSTR(STR_CHG_ACCEPTED)),
      99             :         aStrAllRejected      (SC_RESSTR(STR_CHG_REJECTED)),
     100             :         aStrNoEntry          (SC_RESSTR(STR_CHG_NO_ENTRY)),
     101             :         aStrContentWithChild (SC_RESSTR(STR_CHG_CONTENT_WITH_CHILD)),
     102             :         aStrChildContent     (SC_RESSTR(STR_CHG_CHILD_CONTENT)),
     103             :         aStrChildOrgContent  (SC_RESSTR(STR_CHG_CHILD_ORGCONTENT)),
     104             :         aStrEmpty            (SC_RESSTR(STR_CHG_EMPTY)),
     105             :         aUnknown("Unknown"),
     106             :         bAcceptEnableFlag(true),
     107             :         bRejectEnableFlag(true),
     108             :         bNeedsUpdate(false),
     109             :         bIgnoreMsg(false),
     110             :         bNoSelection(false),
     111             :         bHasFilterEntry(false),
     112           0 :         bUseColor(false)
     113             : {
     114           0 :     m_pAcceptChgCtr = new SvxAcceptChgCtr(get_content_area());
     115           0 :     nAcceptCount=0;
     116           0 :     nRejectCount=0;
     117           0 :     aReOpenTimer.SetTimeout(50);
     118           0 :     aReOpenTimer.SetTimeoutHdl(LINK( this, ScAcceptChgDlg, ReOpenTimerHdl ));
     119             : 
     120           0 :     pTPFilter=m_pAcceptChgCtr->GetFilterPage();
     121           0 :     pTPView=m_pAcceptChgCtr->GetViewPage();
     122           0 :     pTheView=pTPView->GetTableControl();
     123           0 :     aSelectionTimer.SetTimeout(100);
     124           0 :     aSelectionTimer.SetTimeoutHdl(LINK( this, ScAcceptChgDlg, UpdateSelectionHdl ));
     125             : 
     126           0 :     pTPFilter->SetReadyHdl(LINK( this, ScAcceptChgDlg, FilterHandle ));
     127           0 :     pTPFilter->SetRefHdl(LINK( this, ScAcceptChgDlg, RefHandle ));
     128           0 :     pTPFilter->SetModifyHdl(LINK( this, ScAcceptChgDlg, FilterModified));
     129           0 :     pTPFilter->HideRange(false);
     130           0 :     pTPView->InsertCalcHeader();
     131           0 :     pTPView->SetRejectClickHdl( LINK( this, ScAcceptChgDlg,RejectHandle));
     132           0 :     pTPView->SetAcceptClickHdl( LINK(this, ScAcceptChgDlg, AcceptHandle));
     133           0 :     pTPView->SetRejectAllClickHdl( LINK( this, ScAcceptChgDlg,RejectAllHandle));
     134           0 :     pTPView->SetAcceptAllClickHdl( LINK(this, ScAcceptChgDlg, AcceptAllHandle));
     135           0 :     pTheView->SetCalcView();
     136           0 :     pTheView->SetStyle(pTheView->GetStyle()|WB_HASLINES|WB_CLIPCHILDREN|WB_HASBUTTONS|WB_HASBUTTONSATROOT|WB_HSCROLL);
     137           0 :     pTheView->SetExpandingHdl( LINK(this, ScAcceptChgDlg, ExpandingHandle));
     138           0 :     pTheView->SetSelectHdl( LINK(this, ScAcceptChgDlg, SelectHandle));
     139           0 :     pTheView->SetDeselectHdl( LINK(this, ScAcceptChgDlg, SelectHandle));
     140           0 :     pTheView->SetCommandHdl( LINK(this, ScAcceptChgDlg, CommandHdl));
     141           0 :     pTheView->SetColCompareHdl( LINK(this, ScAcceptChgDlg,ColCompareHdl));
     142           0 :     pTheView->SetSelectionMode(MULTIPLE_SELECTION);
     143           0 :     pTheView->SetHighlightRange(1);
     144             : 
     145           0 :     Init();
     146             : 
     147           0 :     UpdateView();
     148           0 :     SvTreeListEntry* pEntry=pTheView->First();
     149           0 :     if(pEntry!=NULL)
     150             :     {
     151           0 :         pTheView->Select(pEntry);
     152             :     }
     153           0 : }
     154             : 
     155           0 : ScAcceptChgDlg::~ScAcceptChgDlg()
     156             : {
     157           0 :     ClearView();
     158           0 :     ScChangeTrack* pChanges=pDoc->GetChangeTrack();
     159             : 
     160           0 :     if(pChanges!=NULL)
     161             :     {
     162           0 :         Link aLink;
     163           0 :         pChanges->SetModifiedLink(aLink);
     164             :     }
     165             : 
     166           0 :     delete m_pAcceptChgCtr;
     167           0 : }
     168             : 
     169           0 : void ScAcceptChgDlg::ReInit(ScViewData* ptrViewData)
     170             : {
     171           0 :     pViewData=ptrViewData;
     172           0 :     if(pViewData!=NULL)
     173           0 :         pDoc=ptrViewData->GetDocument();
     174             :     else
     175           0 :         pDoc=NULL;
     176             : 
     177           0 :     bNoSelection=false;
     178           0 :     bNeedsUpdate=false;
     179           0 :     bIgnoreMsg=false;
     180           0 :     nAcceptCount=0;
     181           0 :     nRejectCount=0;
     182           0 :     bAcceptEnableFlag=true;
     183           0 :     bRejectEnableFlag=true;
     184             : 
     185             :     //  don't call Init here (switching between views), just set link below
     186             :     //  (dialog is just hidden, not deleted anymore, when switching views)
     187           0 :     ClearView();
     188           0 :     UpdateView();
     189             : 
     190           0 :     if ( pDoc )
     191             :     {
     192           0 :         ScChangeTrack* pChanges = pDoc->GetChangeTrack();
     193           0 :         if ( pChanges )
     194           0 :             pChanges->SetModifiedLink( LINK( this, ScAcceptChgDlg, ChgTrackModHdl ) );
     195             :     }
     196           0 : }
     197             : 
     198           0 : void ScAcceptChgDlg::Init()
     199             : {
     200           0 :     ScRange aRange;
     201             : 
     202             :     OSL_ENSURE( pViewData && pDoc, "ViewData oder Document nicht gefunden!" );
     203             : 
     204           0 :     ScChangeTrack* pChanges=pDoc->GetChangeTrack();
     205             : 
     206           0 :     if(pChanges!=NULL)
     207             :     {
     208           0 :         pChanges->SetModifiedLink( LINK( this, ScAcceptChgDlg,ChgTrackModHdl));
     209           0 :         aChangeViewSet.SetTheAuthorToShow(pChanges->GetUser());
     210           0 :         pTPFilter->ClearAuthors();
     211           0 :         const std::set<OUString>& rUserColl = pChanges->GetUserCollection();
     212           0 :         std::set<OUString>::const_iterator it = rUserColl.begin(), itEnd = rUserColl.end();
     213           0 :         for (; it != itEnd; ++it)
     214           0 :             pTPFilter->InsertAuthor(*it);
     215             :     }
     216             : 
     217           0 :     ScChangeViewSettings* pViewSettings=pDoc->GetChangeViewSettings();
     218           0 :     if ( pViewSettings!=NULL )
     219           0 :         aChangeViewSet = *pViewSettings;
     220             :     // adjust TimeField for filter tabpage
     221           0 :     aChangeViewSet.AdjustDateMode( *pDoc );
     222             : 
     223           0 :     pTPFilter->CheckDate(aChangeViewSet.HasDate());
     224           0 :     pTPFilter->SetFirstDate(aChangeViewSet.GetTheFirstDateTime());
     225           0 :     pTPFilter->SetFirstTime(aChangeViewSet.GetTheFirstDateTime());
     226           0 :     pTPFilter->SetLastDate(aChangeViewSet.GetTheLastDateTime());
     227           0 :     pTPFilter->SetLastTime(aChangeViewSet.GetTheLastDateTime());
     228           0 :     pTPFilter->SetDateMode((sal_uInt16)aChangeViewSet.GetTheDateMode());
     229           0 :     pTPFilter->CheckComment(aChangeViewSet.HasComment());
     230           0 :     pTPFilter->SetComment(aChangeViewSet.GetTheComment());
     231             : 
     232           0 :     pTPFilter->CheckAuthor(aChangeViewSet.HasAuthor());
     233           0 :     OUString aString=aChangeViewSet.GetTheAuthorToShow();
     234           0 :     if(!aString.isEmpty())
     235             :     {
     236           0 :         pTPFilter->SelectAuthor(aString);
     237           0 :         if(pTPFilter->GetSelectedAuthor()!=aString)
     238             :         {
     239           0 :             pTPFilter->InsertAuthor(aString);
     240           0 :             pTPFilter->SelectAuthor(aString);
     241             :         }
     242             :     }
     243             :     else
     244           0 :         pTPFilter->SelectedAuthorPos(0);
     245             : 
     246           0 :     pTPFilter->CheckRange(aChangeViewSet.HasRange());
     247             : 
     248           0 :     aRangeList=aChangeViewSet.GetTheRangeList();
     249             : 
     250           0 :     if( !aChangeViewSet.GetTheRangeList().empty() )
     251             :     {
     252           0 :         const ScRange* pRangeEntry = aChangeViewSet.GetTheRangeList().front();
     253           0 :         OUString aRefStr(pRangeEntry->Format(ABS_DREF3D, pDoc));
     254           0 :         pTPFilter->SetRange(aRefStr);
     255             :     }
     256             : 
     257           0 :     InitFilter();
     258           0 : }
     259             : 
     260           0 : void ScAcceptChgDlg::ClearView()
     261             : {
     262           0 :     nAcceptCount=0;
     263           0 :     nRejectCount=0;
     264           0 :     pTheView->SetUpdateMode(false);
     265             : 
     266           0 :     pTheView->Clear();
     267           0 :     pTheView->SetUpdateMode(true);
     268           0 : }
     269             : 
     270           0 : OUString* ScAcceptChgDlg::MakeTypeString(ScChangeActionType eType)
     271             : {
     272             :     OUString* pStr;
     273             : 
     274           0 :     switch(eType)
     275             :     {
     276             : 
     277           0 :         case SC_CAT_INSERT_COLS:    pStr=&aStrInsertCols;break;
     278           0 :         case SC_CAT_INSERT_ROWS:    pStr=&aStrInsertRows;break;
     279           0 :         case SC_CAT_INSERT_TABS:    pStr=&aStrInsertTabs;break;
     280           0 :         case SC_CAT_DELETE_COLS:    pStr=&aStrDeleteCols;break;
     281           0 :         case SC_CAT_DELETE_ROWS:    pStr=&aStrDeleteRows;break;
     282           0 :         case SC_CAT_DELETE_TABS:    pStr=&aStrDeleteTabs;break;
     283           0 :         case SC_CAT_MOVE:           pStr=&aStrMove;break;
     284           0 :         case SC_CAT_CONTENT:        pStr=&aStrContent;break;
     285           0 :         case SC_CAT_REJECT:         pStr=&aStrReject;break;
     286           0 :         default:                    pStr=&aUnknown;break;
     287             :     }
     288           0 :     return pStr;
     289             : }
     290             : 
     291           0 : bool ScAcceptChgDlg::IsValidAction(const ScChangeAction* pScChangeAction)
     292             : {
     293           0 :     if(pScChangeAction==NULL) return false;
     294             : 
     295           0 :     bool bFlag = false;
     296             : 
     297           0 :     ScRange aRef=pScChangeAction->GetBigRange().MakeRange();
     298           0 :     OUString aUser=pScChangeAction->GetUser();
     299           0 :     DateTime aDateTime=pScChangeAction->GetDateTime();
     300             : 
     301           0 :     ScChangeActionType eType=pScChangeAction->GetType();
     302           0 :     OUString aDesc;
     303             : 
     304           0 :     OUString aComment = comphelper::string::remove(pScChangeAction->GetComment(), '\n');
     305             : 
     306           0 :     if(eType==SC_CAT_CONTENT)
     307             :     {
     308           0 :         if(!pScChangeAction->IsDialogParent())
     309           0 :             pScChangeAction->GetDescription(aDesc, pDoc, true);
     310             :     }
     311             :     else
     312           0 :         pScChangeAction->GetDescription(aDesc, pDoc, !pScChangeAction->IsMasterDelete());
     313             : 
     314           0 :     if (!aDesc.isEmpty())
     315             :     {
     316           0 :         aComment += " (";
     317           0 :         aComment += aDesc;
     318           0 :         aComment += ")";
     319             :     }
     320             : 
     321           0 :     if (pTheView->IsValidEntry(aUser, aDateTime, aComment))
     322             :     {
     323           0 :         if(pTPFilter->IsRange())
     324             :         {
     325           0 :             for ( size_t i = 0, nRanges = aRangeList.size(); i < nRanges; ++i )
     326             :             {
     327           0 :                 ScRange* pRangeEntry = aRangeList[ i ];
     328           0 :                 if (pRangeEntry->Intersects(aRef)) {
     329           0 :                     bFlag = true;
     330           0 :                     break;
     331             :                 }
     332             :             }
     333             :         }
     334             :         else
     335           0 :             bFlag=true;
     336             :     }
     337             : 
     338           0 :     return bFlag;
     339             : }
     340             : 
     341           0 : SvTreeListEntry* ScAcceptChgDlg::InsertChangeAction(
     342             :     const ScChangeAction* pScChangeAction, ScChangeActionState /*eState*/,
     343             :     SvTreeListEntry* pParent, bool bDelMaster,bool bDisabled, sal_uLong nPos)
     344             : {
     345           0 :     ScChangeTrack* pChanges=pDoc->GetChangeTrack();
     346             : 
     347           0 :     if(pScChangeAction==NULL || pChanges==NULL) return NULL;
     348             : 
     349           0 :     SvTreeListEntry* pEntry=NULL;
     350             : 
     351           0 :     bool bFlag = false;
     352             : 
     353           0 :     ScRange aRef=pScChangeAction->GetBigRange().MakeRange();
     354           0 :     OUString aUser=pScChangeAction->GetUser();
     355           0 :     DateTime aDateTime=pScChangeAction->GetDateTime();
     356             : 
     357           0 :     OUString aRefStr;
     358           0 :     ScChangeActionType eType=pScChangeAction->GetType();
     359           0 :     OUStringBuffer aBuf;
     360           0 :     OUString aDesc;
     361             : 
     362           0 :     ScRedlinData* pNewData=new ScRedlinData;
     363           0 :     pNewData->pData=(void *)pScChangeAction;
     364           0 :     pNewData->nActionNo=pScChangeAction->GetActionNumber();
     365           0 :     pNewData->bIsAcceptable=pScChangeAction->IsClickable();
     366           0 :     pNewData->bIsRejectable=pScChangeAction->IsRejectable();
     367           0 :     pNewData->bDisabled=!pNewData->bIsAcceptable || bDisabled;
     368           0 :     pNewData->aDateTime=aDateTime;
     369           0 :     pNewData->nRow  = aRef.aStart.Row();
     370           0 :     pNewData->nCol  = aRef.aStart.Col();
     371           0 :     pNewData->nTable= aRef.aStart.Tab();
     372             : 
     373           0 :     if(eType==SC_CAT_CONTENT)
     374             :     {
     375           0 :         if(pScChangeAction->IsDialogParent())
     376             :         {
     377           0 :             aBuf.append(aStrContentWithChild);
     378           0 :             pNewData->nInfo=RD_SPECIAL_VISCONTENT;
     379           0 :             pNewData->bIsRejectable=false;
     380           0 :             pNewData->bIsAcceptable=false;
     381             :         }
     382             :         else
     383             :         {
     384           0 :             aBuf.append(*MakeTypeString(eType));
     385           0 :             pScChangeAction->GetDescription( aDesc, pDoc, true);
     386             :         }
     387             :     }
     388             :     else
     389             :     {
     390           0 :         aBuf.append(aStrContentWithChild);
     391             : 
     392           0 :         if(bDelMaster)
     393             :         {
     394           0 :             pScChangeAction->GetDescription( aDesc, pDoc,true);
     395           0 :             pNewData->bDisabled=true;
     396           0 :             pNewData->bIsRejectable=false;
     397             :         }
     398             :         else
     399           0 :             pScChangeAction->GetDescription( aDesc, pDoc,!pScChangeAction->IsMasterDelete());
     400             : 
     401             :     }
     402             : 
     403           0 :     pScChangeAction->GetRefString(aRefStr, pDoc, true);
     404             : 
     405           0 :     aBuf.append('\t');
     406           0 :     aBuf.append(aRefStr);
     407           0 :     aBuf.append('\t');
     408             : 
     409           0 :     bool bIsGenerated = false;
     410             : 
     411           0 :     if(!pChanges->IsGenerated(pScChangeAction->GetActionNumber()))
     412             :     {
     413           0 :         aBuf.append(aUser);
     414           0 :         aBuf.append('\t');
     415           0 :         aBuf.append(ScGlobal::pLocaleData->getDate(aDateTime));
     416           0 :         aBuf.append(' ');
     417           0 :         aBuf.append(ScGlobal::pLocaleData->getTime(aDateTime));
     418           0 :         aBuf.append('\t');
     419             : 
     420           0 :         bIsGenerated = false;
     421             :     }
     422             :     else
     423             :     {
     424           0 :         aBuf.append('\t');
     425           0 :         aBuf.append('\t');
     426           0 :         bIsGenerated = true;
     427             :     }
     428             : 
     429           0 :     OUString aComment = comphelper::string::remove(pScChangeAction->GetComment(), '\n');
     430             : 
     431           0 :     if (!aDesc.isEmpty())
     432             :     {
     433           0 :         aComment +=  " (";
     434           0 :         aComment += aDesc;
     435           0 :         aComment += ")";
     436             :     }
     437             : 
     438           0 :     aBuf.append(aComment);
     439             : 
     440           0 :     if (pTheView->IsValidEntry(aUser, aDateTime) || bIsGenerated)
     441             :     {
     442           0 :         if (pTheView->IsValidComment(aComment))
     443             :         {
     444           0 :             if(pTPFilter->IsRange())
     445             :             {
     446           0 :                 for ( size_t i = 0, nRanges = aRangeList.size(); i < nRanges; ++i )
     447             :                 {
     448           0 :                     ScRange* pRangeEntry = aRangeList[ i ];
     449           0 :                     if( pRangeEntry->Intersects(aRef) )
     450             :                     {
     451           0 :                         bHasFilterEntry=true;
     452           0 :                         bFlag=true;
     453           0 :                         break;
     454             :                     }
     455             :                 }
     456             :             }
     457           0 :             else if(!bIsGenerated)
     458             :             {
     459           0 :                 bHasFilterEntry=true;
     460           0 :                 bFlag=true;
     461             :             }
     462             :         }
     463             :     }
     464             : 
     465           0 :     if(!bFlag&& bUseColor&& pParent==NULL)
     466             :     {
     467             :         pEntry = pTheView->InsertEntry(
     468           0 :             aBuf.makeStringAndClear() ,pNewData, Color(COL_LIGHTBLUE), pParent, nPos);
     469             :     }
     470           0 :     else if(bFlag&& bUseColor&& pParent!=NULL)
     471             :     {
     472             :         pEntry = pTheView->InsertEntry(
     473           0 :             aBuf.makeStringAndClear(), pNewData, Color(COL_GREEN), pParent, nPos);
     474           0 :         SvTreeListEntry* pExpEntry=pParent;
     475             : 
     476           0 :         while(pExpEntry!=NULL && !pTheView->IsExpanded(pExpEntry))
     477             :         {
     478           0 :             SvTreeListEntry* pTmpEntry=pTheView->GetParent(pExpEntry);
     479             : 
     480           0 :             if(pTmpEntry!=NULL) pTheView->Expand(pExpEntry);
     481             : 
     482           0 :             pExpEntry=pTmpEntry;
     483           0 :         }
     484             :     }
     485             :     else
     486             :     {
     487             :         pEntry = pTheView->InsertEntry(
     488           0 :             aBuf.makeStringAndClear(), pNewData, pParent, nPos);
     489             :     }
     490           0 :     return pEntry;
     491             : }
     492             : 
     493           0 : SvTreeListEntry* ScAcceptChgDlg::InsertFilteredAction(
     494             :     const ScChangeAction* pScChangeAction, ScChangeActionState eState,
     495             :     SvTreeListEntry* pParent, bool bDelMaster, bool bDisabled, sal_uLong nPos)
     496             : {
     497             : 
     498           0 :     ScChangeTrack* pChanges=pDoc->GetChangeTrack();
     499             : 
     500           0 :     if(pScChangeAction==NULL || pChanges==NULL) return NULL;
     501             : 
     502           0 :     bool bIsGenerated = pChanges->IsGenerated(pScChangeAction->GetActionNumber());
     503             : 
     504           0 :     SvTreeListEntry* pEntry=NULL;
     505             : 
     506           0 :     bool bFlag = false;
     507             : 
     508           0 :     ScRange aRef=pScChangeAction->GetBigRange().MakeRange();
     509           0 :     OUString aUser=pScChangeAction->GetUser();
     510           0 :     DateTime aDateTime=pScChangeAction->GetDateTime();
     511             : 
     512           0 :     if (pTheView->IsValidEntry(aUser, aDateTime) || bIsGenerated)
     513             :     {
     514           0 :         if(pTPFilter->IsRange())
     515             :         {
     516           0 :             for ( size_t i = 0, nRanges = aRangeList.size(); i < nRanges; ++i )
     517             :             {
     518           0 :                 ScRange* pRangeEntry=aRangeList[ i ];
     519           0 :                 if( pRangeEntry->Intersects(aRef) )
     520             :                 {
     521           0 :                     if( pScChangeAction->GetState()==eState )
     522           0 :                         bFlag = true;
     523           0 :                     break;
     524             :                 }
     525             :             }
     526             :         }
     527           0 :         else if(pScChangeAction->GetState()==eState && !bIsGenerated)
     528           0 :             bFlag = true;
     529             :     }
     530             : 
     531           0 :     if(bFlag)
     532             :     {
     533             : 
     534           0 :         OUString aRefStr;
     535           0 :         ScChangeActionType eType=pScChangeAction->GetType();
     536           0 :         OUString aString;
     537           0 :         OUString aDesc;
     538             : 
     539           0 :         ScRedlinData* pNewData=new ScRedlinData;
     540           0 :         pNewData->pData=(void *)pScChangeAction;
     541           0 :         pNewData->nActionNo=pScChangeAction->GetActionNumber();
     542           0 :         pNewData->bIsAcceptable=pScChangeAction->IsClickable();
     543           0 :         pNewData->bIsRejectable=pScChangeAction->IsRejectable();
     544           0 :         pNewData->bDisabled=!pNewData->bIsAcceptable || bDisabled;
     545           0 :         pNewData->aDateTime=aDateTime;
     546           0 :         pNewData->nRow  = aRef.aStart.Row();
     547           0 :         pNewData->nCol  = aRef.aStart.Col();
     548           0 :         pNewData->nTable= aRef.aStart.Tab();
     549             : 
     550           0 :         if(eType==SC_CAT_CONTENT)
     551             :         {
     552           0 :             if(pScChangeAction->IsDialogParent())
     553             :             {
     554           0 :                 aString=aStrContentWithChild;
     555           0 :                 pNewData->nInfo=RD_SPECIAL_VISCONTENT;
     556           0 :                 pNewData->bIsRejectable=false;
     557           0 :                 pNewData->bIsAcceptable=false;
     558             :             }
     559             :             else
     560             :             {
     561           0 :                 aString=*MakeTypeString(eType);
     562           0 :                 pScChangeAction->GetDescription( aDesc, pDoc, true);
     563             :             }
     564             :         }
     565             :         else
     566             :         {
     567           0 :             aString=*MakeTypeString(eType);
     568             : 
     569           0 :             if(bDelMaster)
     570             :             {
     571           0 :                 pScChangeAction->GetDescription( aDesc, pDoc,true);
     572           0 :                 pNewData->bDisabled=true;
     573           0 :                 pNewData->bIsRejectable=false;
     574             :             }
     575             :             else
     576           0 :                 pScChangeAction->GetDescription( aDesc, pDoc,!pScChangeAction->IsMasterDelete());
     577             : 
     578             :         }
     579             : 
     580           0 :         aString += "\t";
     581           0 :         pScChangeAction->GetRefString(aRefStr, pDoc, true);
     582           0 :         aString += aRefStr;
     583           0 :         aString += "\t";
     584             : 
     585           0 :         if(!bIsGenerated)
     586             :         {
     587           0 :             aString += aUser;
     588           0 :             aString += "\t";
     589           0 :             aString += ScGlobal::pLocaleData->getDate(aDateTime);
     590           0 :             aString += " ";
     591           0 :             aString += ScGlobal::pLocaleData->getTime(aDateTime);
     592           0 :             aString += "\t";
     593             :         }
     594             :         else
     595             :         {
     596           0 :             aString += "\t";
     597           0 :             aString += "\t";
     598             :         }
     599             : 
     600           0 :         OUString aComment = comphelper::string::remove(pScChangeAction->GetComment(), '\n');
     601             : 
     602           0 :         if (!aDesc.isEmpty())
     603             :         {
     604           0 :             aComment += " (" ;
     605           0 :             aComment += aDesc;
     606           0 :             aComment += ")";
     607             :         }
     608           0 :         if (pTheView->IsValidComment(aComment))
     609             :         {
     610           0 :             aString+=aComment;
     611           0 :             pEntry=pTheView->InsertEntry(aString,pNewData,pParent,nPos);
     612             :         }
     613             :         else
     614           0 :             delete pNewData;
     615             :     }
     616           0 :     return pEntry;
     617             : }
     618             : 
     619           0 : SvTreeListEntry* ScAcceptChgDlg::InsertChangeActionContent(const ScChangeActionContent* pScChangeAction,
     620             :                                                           SvTreeListEntry* pParent, sal_uLong nSpecial)
     621             : {
     622           0 :     ScChangeTrack* pChanges=pDoc->GetChangeTrack();
     623           0 :     SvTreeListEntry* pEntry=NULL;
     624             : 
     625           0 :     if(pScChangeAction==NULL || pChanges==NULL) return NULL;
     626             : 
     627           0 :     bool bIsGenerated = pChanges->IsGenerated(pScChangeAction->GetActionNumber());
     628             : 
     629           0 :     bool bFlag = false;
     630             : 
     631           0 :     ScRange aRef=pScChangeAction->GetBigRange().MakeRange();
     632           0 :     OUString aUser=pScChangeAction->GetUser();
     633           0 :     DateTime aDateTime=pScChangeAction->GetDateTime();
     634             : 
     635           0 :     if (pTheView->IsValidEntry(aUser, aDateTime) || bIsGenerated)
     636             :     {
     637           0 :         if(pTPFilter->IsRange())
     638             :         {
     639           0 :             for ( size_t i = 0, nRanges = aRangeList.size(); i < nRanges; ++i )
     640             :             {
     641           0 :                 ScRange* pRangeEntry = aRangeList[ i ];
     642           0 :                 if( pRangeEntry->Intersects(aRef) )
     643             :                 {
     644           0 :                     bFlag=true;
     645           0 :                     break;
     646             :                 }
     647             :             }
     648             :         }
     649           0 :         else if(!bIsGenerated)
     650           0 :             bFlag=true;
     651             :     }
     652             : 
     653           0 :     OUString aRefStr;
     654           0 :     OUString aString;
     655           0 :     OUString a2String;
     656           0 :     OUString aDesc;
     657             : 
     658           0 :     if(nSpecial==RD_SPECIAL_CONTENT)
     659             :     {
     660           0 :         OUString aTmp;
     661           0 :         pScChangeAction->GetOldString(aTmp, pDoc);
     662           0 :         a2String = aTmp;
     663           0 :         if(a2String.isEmpty()) a2String=aStrEmpty;
     664             : 
     665             :         //aString+="\'";
     666           0 :         aString+=a2String;
     667             :         //aString+="\'";
     668             : 
     669           0 :         aDesc=aStrChildOrgContent;
     670           0 :         aDesc += ": ";
     671             :     }
     672             :     else
     673             :     {
     674           0 :         OUString aTmp;
     675           0 :         pScChangeAction->GetNewString(aTmp, pDoc);
     676           0 :         a2String = aTmp;
     677           0 :         if(a2String.isEmpty())
     678             :         {
     679           0 :             a2String=aStrEmpty;
     680           0 :             aString+=a2String;
     681             :         }
     682             :         else
     683             :         {
     684           0 :             aString += "\'";
     685           0 :             aString += a2String;
     686           0 :             aString += "\'";
     687           0 :             a2String =aString;
     688             :         }
     689           0 :         aDesc = aStrChildContent;
     690             : 
     691             :     }
     692             : 
     693           0 :     aDesc += a2String;
     694           0 :     aString += "\t";
     695           0 :     pScChangeAction->GetRefString(aRefStr, pDoc, true);
     696           0 :     aString += aRefStr;
     697           0 :     aString += "\t";
     698             : 
     699           0 :     if(!bIsGenerated)
     700             :     {
     701           0 :         aString += aUser;
     702           0 :         aString += "\t";
     703             : 
     704           0 :         aString += ScGlobal::pLocaleData->getDate(aDateTime);
     705           0 :         aString += " ";
     706           0 :         aString += ScGlobal::pLocaleData->getTime(aDateTime);
     707           0 :         aString += "\t";
     708             :     }
     709             :     else
     710             :     {
     711           0 :         aString += "\t";
     712           0 :         aString += "\t";
     713             :     }
     714             : 
     715           0 :     OUString aComment = comphelper::string::remove(pScChangeAction->GetComment(), '\n');
     716             : 
     717           0 :     if(!aDesc.isEmpty())
     718             :     {
     719           0 :         aComment += " (" ;
     720           0 :         aComment += aDesc;
     721           0 :         aComment += ")";
     722             :     }
     723             : 
     724           0 :     aString+=aComment;
     725             : 
     726           0 :     ScRedlinData* pNewData=new ScRedlinData;
     727           0 :     pNewData->nInfo=nSpecial;
     728           0 :     pNewData->pData=(void *)pScChangeAction;
     729           0 :     pNewData->nActionNo=pScChangeAction->GetActionNumber();
     730           0 :     pNewData->bIsAcceptable=pScChangeAction->IsClickable();
     731           0 :     pNewData->bIsRejectable=false;
     732           0 :     pNewData->bDisabled=!pNewData->bIsAcceptable;
     733           0 :     pNewData->aDateTime=aDateTime;
     734           0 :     pNewData->nRow  = aRef.aStart.Row();
     735           0 :     pNewData->nCol  = aRef.aStart.Col();
     736           0 :     pNewData->nTable= aRef.aStart.Tab();
     737             : 
     738           0 :     if (pTheView->IsValidComment(aComment) && bFlag)
     739             :     {
     740           0 :         bHasFilterEntry=true;
     741           0 :         pEntry=pTheView->InsertEntry(aString,pNewData,pParent);
     742             :     }
     743             :     else
     744           0 :         pEntry=pTheView->InsertEntry(aString,pNewData,Color(COL_LIGHTBLUE),pParent);
     745           0 :     return pEntry;
     746             : }
     747             : 
     748           0 : bool ScAcceptChgDlg::PreNotify( NotifyEvent& rNEvt )
     749             : {
     750           0 :     if(rNEvt.GetType()==EVENT_GETFOCUS && bNeedsUpdate)
     751             :     {
     752           0 :         ClearView();
     753           0 :         UpdateView();
     754           0 :         bNoSelection=false;
     755             :     }
     756             : 
     757           0 :     return SfxModelessDialog::PreNotify(rNEvt);
     758             : }
     759             : 
     760           0 : void ScAcceptChgDlg::UpdateView()
     761             : {
     762           0 :     bNeedsUpdate=false;
     763           0 :     SvTreeListEntry* pParent=NULL;
     764           0 :     ScChangeTrack* pChanges=NULL;
     765           0 :     const ScChangeAction* pScChangeAction=NULL;
     766           0 :     bAcceptEnableFlag=true;
     767           0 :     bRejectEnableFlag=true;
     768           0 :     SetPointer(Pointer(POINTER_WAIT));
     769           0 :     pTheView->SetUpdateMode(false);
     770           0 :     bool bFilterFlag = pTPFilter->IsDate() || pTPFilter->IsRange() ||
     771           0 :         pTPFilter->IsAuthor() || pTPFilter->IsComment();
     772             : 
     773           0 :     bUseColor = bFilterFlag;
     774             : 
     775           0 :     if(pDoc!=NULL)
     776             :     {
     777           0 :         pChanges=pDoc->GetChangeTrack();
     778           0 :         if(pChanges!=NULL)
     779           0 :             pScChangeAction=pChanges->GetFirst();
     780             :     }
     781           0 :     bool bTheFlag = false;
     782             : 
     783           0 :     while(pScChangeAction!=NULL)
     784             :     {
     785           0 :         bHasFilterEntry=false;
     786           0 :         switch(pScChangeAction->GetState())
     787             :         {
     788             :             case SC_CAS_VIRGIN:
     789             : 
     790           0 :                 if(pScChangeAction->IsDialogRoot())
     791             :                 {
     792           0 :                     if(pScChangeAction->IsDialogParent())
     793           0 :                         pParent=InsertChangeAction(pScChangeAction,SC_CAS_VIRGIN);
     794             :                     else
     795           0 :                         pParent=InsertFilteredAction(pScChangeAction,SC_CAS_VIRGIN);
     796             :                 }
     797             :                 else
     798           0 :                     pParent=NULL;
     799             : 
     800           0 :                 bTheFlag=true;
     801           0 :                 break;
     802             : 
     803             :             case SC_CAS_ACCEPTED:
     804           0 :                 pParent=NULL;
     805           0 :                 nAcceptCount++;
     806           0 :                 break;
     807             : 
     808             :             case SC_CAS_REJECTED:
     809           0 :                 pParent=NULL;
     810           0 :                 nRejectCount++;
     811           0 :                 break;
     812             :         }
     813             : 
     814           0 :         if(pParent!=NULL && pScChangeAction->IsDialogParent())
     815             :         {
     816           0 :             if(!bFilterFlag)
     817           0 :                 pParent->EnableChildrenOnDemand(true);
     818             :             else
     819             :             {
     820           0 :                 bool bTestFlag = bHasFilterEntry;
     821           0 :                 bHasFilterEntry=false;
     822           0 :                 if(Expand(pChanges,pScChangeAction,pParent,!bTestFlag)&&!bTestFlag)
     823           0 :                     pTheView->RemoveEntry(pParent);
     824             :             }
     825             :         }
     826             : 
     827           0 :         pScChangeAction=pScChangeAction->GetNext();
     828             :     }
     829             : 
     830           0 :     if( bTheFlag && (!pDoc->IsDocEditable() || pChanges->IsProtected()) )
     831           0 :         bTheFlag=false;
     832             : 
     833           0 :     pTPView->EnableAccept(bTheFlag);
     834           0 :     pTPView->EnableAcceptAll(bTheFlag);
     835           0 :     pTPView->EnableReject(bTheFlag);
     836           0 :     pTPView->EnableRejectAll(bTheFlag);
     837             : 
     838           0 :     if(nAcceptCount>0)
     839             :     {
     840             :         pParent=pTheView->InsertEntry(
     841             :             aStrAllAccepted, static_cast< RedlinData * >(NULL),
     842           0 :             static_cast< SvTreeListEntry * >(NULL));
     843           0 :         pParent->EnableChildrenOnDemand(true);
     844             :     }
     845           0 :     if(nRejectCount>0)
     846             :     {
     847             :         pParent=pTheView->InsertEntry(
     848             :             aStrAllRejected, static_cast< RedlinData * >(NULL),
     849           0 :             static_cast< SvTreeListEntry * >(NULL));
     850           0 :         pParent->EnableChildrenOnDemand(true);
     851             :     }
     852           0 :     pTheView->SetUpdateMode(true);
     853           0 :     SetPointer(Pointer(POINTER_ARROW));
     854           0 :     SvTreeListEntry* pEntry=pTheView->First();
     855           0 :     if(pEntry!=NULL)
     856           0 :         pTheView->Select(pEntry);
     857           0 : }
     858             : 
     859           0 : IMPL_LINK_NOARG(ScAcceptChgDlg, RefHandle)
     860             : {
     861           0 :     sal_uInt16 nId  =ScSimpleRefDlgWrapper::GetChildWindowId();
     862             : 
     863           0 :     ScSimpleRefDlgWrapper::SetDefaultPosSize(GetPosPixel(),GetSizePixel(),true);
     864             : 
     865           0 :     SC_MOD()->SetRefDialog( nId, true );
     866             : 
     867           0 :     SfxViewFrame* pViewFrm = pViewData->GetViewShell()->GetViewFrame();
     868           0 :     ScSimpleRefDlgWrapper* pWnd = static_cast<ScSimpleRefDlgWrapper*>(pViewFrm->GetChildWindow( nId ));
     869             : 
     870           0 :     if(pWnd!=NULL)
     871             :     {
     872           0 :         sal_uInt16 nAcceptId=ScAcceptChgDlgWrapper::GetChildWindowId();
     873           0 :         pViewFrm->ShowChildWindow(nAcceptId,false);
     874           0 :         pWnd->SetCloseHdl(LINK( this, ScAcceptChgDlg,RefInfoHandle));
     875           0 :         pWnd->SetRefString(pTPFilter->GetRange());
     876           0 :         ScSimpleRefDlgWrapper::SetAutoReOpen(false);
     877           0 :         vcl::Window* pWin=pWnd->GetWindow();
     878           0 :         pWin->SetPosSizePixel(GetPosPixel(),GetSizePixel());
     879           0 :         Hide();
     880           0 :         pWin->SetText(GetText());
     881           0 :         pWnd->StartRefInput();
     882             :     }
     883           0 :     return 0;
     884             : }
     885             : 
     886           0 : IMPL_LINK( ScAcceptChgDlg, RefInfoHandle, OUString*, pResult)
     887             : {
     888             :     sal_uInt16 nId;
     889             : 
     890           0 :     ScSimpleRefDlgWrapper::SetAutoReOpen(true);
     891             : 
     892           0 :     SfxViewFrame* pViewFrm = pViewData->GetViewShell()->GetViewFrame();
     893           0 :     if(pResult!=NULL)
     894             :     {
     895           0 :         pTPFilter->SetRange(*pResult);
     896           0 :         FilterHandle(pTPFilter);
     897             : 
     898           0 :         nId = ScSimpleRefDlgWrapper::GetChildWindowId();
     899           0 :         ScSimpleRefDlgWrapper* pWnd = static_cast<ScSimpleRefDlgWrapper*>(pViewFrm->GetChildWindow( nId ));
     900             : 
     901           0 :         if(pWnd!=NULL)
     902             :         {
     903           0 :             vcl::Window* pWin=pWnd->GetWindow();
     904           0 :             Size aWinSize=pWin->GetSizePixel();
     905           0 :             aWinSize.Width()=GetSizePixel().Width();
     906           0 :             SetPosSizePixel(pWin->GetPosPixel(),aWinSize);
     907           0 :             Invalidate();
     908             :         }
     909           0 :         nId = ScAcceptChgDlgWrapper::GetChildWindowId();
     910           0 :         pViewFrm->ShowChildWindow( nId, true );
     911             :     }
     912             :     else
     913             :     {
     914           0 :         nId = ScAcceptChgDlgWrapper::GetChildWindowId();
     915           0 :         pViewFrm->SetChildWindow( nId, false );
     916             :     }
     917           0 :     return 0;
     918             : }
     919             : 
     920           0 : IMPL_LINK( ScAcceptChgDlg, FilterHandle, SvxTPFilter*, pRef )
     921             : {
     922           0 :     if(pRef!=NULL)
     923             :     {
     924           0 :         ClearView();
     925           0 :         aRangeList.RemoveAll();
     926           0 :         aRangeList.Parse(pTPFilter->GetRange(),pDoc);
     927           0 :         UpdateView();
     928             :     }
     929           0 :     return 0;
     930             : }
     931             : 
     932           0 : IMPL_LINK( ScAcceptChgDlg, RejectHandle, SvxTPView*, pRef )
     933             : {
     934           0 :     SetPointer(Pointer(POINTER_WAIT));
     935             : 
     936           0 :     bIgnoreMsg=true;
     937           0 :     ScChangeTrack* pChanges=pDoc->GetChangeTrack();
     938             : 
     939           0 :     if(pRef!=NULL)
     940             :     {
     941           0 :         SvTreeListEntry* pEntry=pTheView->FirstSelected();
     942           0 :         while(pEntry!=NULL)
     943             :         {
     944           0 :             ScRedlinData *pEntryData=(ScRedlinData *)(pEntry->GetUserData());
     945           0 :             if(pEntryData!=NULL)
     946             :             {
     947             :                 ScChangeAction* pScChangeAction=
     948           0 :                         (ScChangeAction*) pEntryData->pData;
     949             : 
     950           0 :                 if(pScChangeAction->GetType()==SC_CAT_INSERT_TABS)
     951           0 :                     pViewData->SetTabNo(0);
     952             : 
     953           0 :                 pChanges->Reject(pScChangeAction);
     954             :             }
     955           0 :             pEntry = pTheView->NextSelected(pEntry);
     956             :         }
     957           0 :         ScDocShell* pDocSh=pViewData->GetDocShell();
     958           0 :         pDocSh->PostPaintExtras();
     959           0 :         pDocSh->PostPaintGridAll();
     960           0 :         pDocSh->GetUndoManager()->Clear();
     961           0 :         pDocSh->SetDocumentModified();
     962           0 :         ClearView();
     963           0 :         UpdateView();
     964             :     }
     965           0 :     SetPointer(Pointer(POINTER_ARROW));
     966             : 
     967           0 :     bIgnoreMsg=false;
     968           0 :     return 0;
     969             : }
     970           0 : IMPL_LINK( ScAcceptChgDlg, AcceptHandle, SvxTPView*, pRef )
     971             : {
     972           0 :     SetPointer(Pointer(POINTER_WAIT));
     973             : 
     974           0 :     ScChangeTrack* pChanges=pDoc->GetChangeTrack();
     975           0 :     bIgnoreMsg=true;
     976           0 :     if(pRef!=NULL)
     977             :     {
     978           0 :         SvTreeListEntry* pEntry=pTheView->FirstSelected();
     979           0 :         while(pEntry!=NULL)
     980             :         {
     981           0 :             ScRedlinData *pEntryData=(ScRedlinData *)(pEntry->GetUserData());
     982           0 :             if(pEntryData!=NULL)
     983             :             {
     984             :                 ScChangeAction* pScChangeAction=
     985           0 :                         (ScChangeAction*) pEntryData->pData;
     986           0 :                 if(pScChangeAction->GetType()==SC_CAT_CONTENT)
     987             :                 {
     988           0 :                     if(pEntryData->nInfo==RD_SPECIAL_CONTENT)
     989           0 :                         pChanges->SelectContent(pScChangeAction,true);
     990             :                     else
     991           0 :                         pChanges->SelectContent(pScChangeAction);
     992             :                 }
     993             :                 else
     994           0 :                     pChanges->Accept(pScChangeAction);
     995             :             }
     996           0 :             pEntry = pTheView->NextSelected(pEntry);
     997             :         }
     998           0 :         ScDocShell* pDocSh=pViewData->GetDocShell();
     999           0 :         pDocSh->PostPaintExtras();
    1000           0 :         pDocSh->PostPaintGridAll();
    1001           0 :         pDocSh->SetDocumentModified();
    1002           0 :         ClearView();
    1003           0 :         UpdateView();
    1004             :     }
    1005           0 :     bIgnoreMsg=false;
    1006             : 
    1007           0 :     return 0;
    1008             : }
    1009             : 
    1010           0 : void ScAcceptChgDlg::RejectFiltered()
    1011             : {
    1012           0 :     if(pDoc==NULL) return;
    1013           0 :     ScChangeTrack* pChanges=pDoc->GetChangeTrack();
    1014           0 :     const ScChangeAction* pScChangeAction=NULL;
    1015             : 
    1016           0 :     if(pChanges!=NULL)
    1017             :     {
    1018           0 :         pScChangeAction=pChanges->GetLast();
    1019             :     }
    1020             : 
    1021           0 :     while(pScChangeAction!=NULL)
    1022             :     {
    1023           0 :         if(pScChangeAction->IsDialogRoot())
    1024           0 :             if(IsValidAction(pScChangeAction))
    1025           0 :                 pChanges->Reject((ScChangeAction*)pScChangeAction);
    1026             : 
    1027           0 :         pScChangeAction=pScChangeAction->GetPrev();
    1028             :     }
    1029             : }
    1030           0 : void ScAcceptChgDlg::AcceptFiltered()
    1031             : {
    1032           0 :     if(pDoc==NULL) return;
    1033           0 :     ScChangeTrack* pChanges=pDoc->GetChangeTrack();
    1034           0 :     const ScChangeAction* pScChangeAction=NULL;
    1035             : 
    1036           0 :     if(pChanges!=NULL)
    1037           0 :         pScChangeAction=pChanges->GetLast();
    1038             : 
    1039           0 :     while(pScChangeAction!=NULL)
    1040             :     {
    1041           0 :         if(pScChangeAction->IsDialogRoot())
    1042           0 :             if(IsValidAction(pScChangeAction))
    1043           0 :                 pChanges->Accept((ScChangeAction*)pScChangeAction);
    1044             : 
    1045           0 :         pScChangeAction=pScChangeAction->GetPrev();
    1046             :     }
    1047             : }
    1048             : 
    1049           0 : IMPL_LINK_NOARG(ScAcceptChgDlg, RejectAllHandle)
    1050             : {
    1051           0 :     SetPointer(Pointer(POINTER_WAIT));
    1052           0 :     bIgnoreMsg=true;
    1053           0 :     ScChangeTrack* pChanges=pDoc->GetChangeTrack();
    1054           0 :     if(pChanges!=NULL)
    1055             :     {
    1056           0 :         if(pTPFilter->IsDate()||pTPFilter->IsAuthor()||pTPFilter->IsRange()||pTPFilter->IsComment())
    1057           0 :             RejectFiltered();
    1058             :         else
    1059           0 :             pChanges->RejectAll();
    1060             : 
    1061           0 :         pViewData->SetTabNo(0);
    1062             : 
    1063           0 :         ScDocShell* pDocSh=pViewData->GetDocShell();
    1064           0 :         pDocSh->PostPaintExtras();
    1065           0 :         pDocSh->PostPaintGridAll();
    1066           0 :         pDocSh->GetUndoManager()->Clear();
    1067           0 :         pDocSh->SetDocumentModified();
    1068           0 :         ClearView();
    1069           0 :         UpdateView();
    1070             :     }
    1071           0 :     SetPointer(Pointer(POINTER_ARROW));
    1072             : 
    1073           0 :     bIgnoreMsg=false;
    1074             : 
    1075           0 :     return 0;
    1076             : }
    1077             : 
    1078           0 : IMPL_LINK_NOARG(ScAcceptChgDlg, AcceptAllHandle)
    1079             : {
    1080           0 :     SetPointer(Pointer(POINTER_WAIT));
    1081             : 
    1082           0 :     bIgnoreMsg=true;
    1083           0 :     ScChangeTrack* pChanges=pDoc->GetChangeTrack();
    1084           0 :     if(pChanges!=NULL)
    1085             :     {
    1086           0 :         if(pTPFilter->IsDate()||pTPFilter->IsAuthor()||pTPFilter->IsRange()||pTPFilter->IsComment())
    1087           0 :             AcceptFiltered();
    1088             :         else
    1089           0 :             pChanges->AcceptAll();
    1090             : 
    1091           0 :         ScDocShell* pDocSh=pViewData->GetDocShell();
    1092           0 :         pDocSh->PostPaintExtras();
    1093           0 :         pDocSh->PostPaintGridAll();
    1094           0 :         pDocSh->SetDocumentModified();
    1095           0 :         ClearView();
    1096           0 :         UpdateView();
    1097             :     }
    1098           0 :     bIgnoreMsg=false;
    1099           0 :     SetPointer(Pointer(POINTER_ARROW));
    1100             : 
    1101           0 :     return 0;
    1102             : }
    1103             : 
    1104           0 : IMPL_LINK_NOARG(ScAcceptChgDlg, SelectHandle)
    1105             : {
    1106           0 :     if(!bNoSelection)
    1107           0 :         aSelectionTimer.Start();
    1108             : 
    1109           0 :     bNoSelection=false;
    1110           0 :     return 0;
    1111             : }
    1112             : 
    1113           0 : void ScAcceptChgDlg::GetDependents(  const ScChangeAction* pScChangeAction,
    1114             :                                     ScChangeActionMap& aActionMap,
    1115             :                                     SvTreeListEntry* pEntry)
    1116             : {
    1117           0 :     ScChangeTrack* pChanges=pDoc->GetChangeTrack();
    1118             : 
    1119           0 :     SvTreeListEntry* pParent=pTheView->GetParent(pEntry);
    1120           0 :     if(pParent!=NULL)
    1121             :     {
    1122           0 :         ScRedlinData *pParentData=(ScRedlinData *)(pParent->GetUserData());
    1123           0 :         ScChangeAction* pParentAction=(ScChangeAction*) pParentData->pData;
    1124             : 
    1125           0 :         if(pParentAction!=pScChangeAction)
    1126             :             pChanges->GetDependents((ScChangeAction*) pScChangeAction,
    1127           0 :                         aActionMap,pScChangeAction->IsMasterDelete());
    1128             :         else
    1129             :             pChanges->GetDependents( (ScChangeAction*) pScChangeAction,
    1130           0 :                         aActionMap );
    1131             :     }
    1132             :     else
    1133             :         pChanges->GetDependents((ScChangeAction*) pScChangeAction,
    1134           0 :                     aActionMap, pScChangeAction->IsMasterDelete() );
    1135           0 : }
    1136             : 
    1137           0 : bool ScAcceptChgDlg::InsertContentChildren(ScChangeActionMap* pActionMap,SvTreeListEntry* pParent)
    1138             : {
    1139           0 :     bool bTheTestFlag = true;
    1140           0 :     ScRedlinData *pEntryData=(ScRedlinData *)(pParent->GetUserData());
    1141           0 :     const ScChangeAction* pScChangeAction = (ScChangeAction*) pEntryData->pData;
    1142           0 :     bool bParentInserted = false;
    1143             :     // If the parent is a MatrixOrigin then place it in the right order before
    1144             :     // the MatrixReferences. Also if it is the first content change at this
    1145             :     // position don't insert the first dependent MatrixReference as the special
    1146             :     // content (original value) but insert the predecessor of the MatrixOrigin
    1147             :     // itself instead.
    1148           0 :     if ( pScChangeAction->GetType() == SC_CAT_CONTENT &&
    1149           0 :             static_cast<const ScChangeActionContent*>(pScChangeAction)->IsMatrixOrigin() )
    1150             :     {
    1151           0 :         pActionMap->insert( ::std::make_pair( pScChangeAction->GetActionNumber(),
    1152           0 :             const_cast<ScChangeAction*>( pScChangeAction ) ) );
    1153           0 :         bParentInserted = true;
    1154             :     }
    1155           0 :     SvTreeListEntry* pEntry=NULL;
    1156             : 
    1157           0 :     ScChangeActionMap::iterator itChangeAction = pActionMap->begin();
    1158           0 :     while( itChangeAction != pActionMap->end() )
    1159             :     {
    1160           0 :         if( itChangeAction->second->GetState()==SC_CAS_VIRGIN )
    1161           0 :             break;
    1162           0 :         ++itChangeAction;
    1163             :     }
    1164             : 
    1165           0 :     if( itChangeAction == pActionMap->end() )
    1166           0 :         return true;
    1167             : 
    1168             :     SvTreeListEntry* pOriginal = InsertChangeActionContent(
    1169           0 :         dynamic_cast<const ScChangeActionContent*>( itChangeAction->second ),
    1170           0 :         pParent, RD_SPECIAL_CONTENT );
    1171             : 
    1172           0 :     if(pOriginal!=NULL)
    1173             :     {
    1174           0 :         bTheTestFlag=false;
    1175           0 :         ScRedlinData *pParentData=(ScRedlinData *)(pOriginal->GetUserData());
    1176           0 :         pParentData->pData=(void *)pScChangeAction;
    1177           0 :         pParentData->nActionNo=pScChangeAction->GetActionNumber();
    1178           0 :         pParentData->bIsAcceptable=pScChangeAction->IsRejectable(); // select old value
    1179           0 :         pParentData->bIsRejectable=false;
    1180           0 :         pParentData->bDisabled=false;
    1181             :     }
    1182           0 :     while( itChangeAction != pActionMap->end() )
    1183             :     {
    1184           0 :         if( itChangeAction->second->GetState() == SC_CAS_VIRGIN )
    1185             :         {
    1186           0 :             pEntry = InsertChangeActionContent( dynamic_cast<const ScChangeActionContent*>( itChangeAction->second ),
    1187           0 :                 pParent, RD_SPECIAL_NONE );
    1188             : 
    1189           0 :             if(pEntry!=NULL)
    1190           0 :                 bTheTestFlag=false;
    1191             :         }
    1192           0 :         ++itChangeAction;
    1193             :     }
    1194             : 
    1195           0 :     if ( !bParentInserted )
    1196             :     {
    1197             :         pEntry=InsertChangeActionContent(static_cast<const ScChangeActionContent*>(
    1198           0 :                                 pScChangeAction),pParent,RD_SPECIAL_NONE);
    1199             : 
    1200           0 :         if(pEntry!=NULL)
    1201             :         {
    1202           0 :             bTheTestFlag=false;
    1203           0 :             ScRedlinData *pParentData=(ScRedlinData *)(pEntry->GetUserData());
    1204           0 :             pParentData->pData=(void *)pScChangeAction;
    1205           0 :             pParentData->nActionNo=pScChangeAction->GetActionNumber();
    1206           0 :             pParentData->bIsAcceptable=pScChangeAction->IsClickable();
    1207           0 :             pParentData->bIsRejectable=false;
    1208           0 :             pParentData->bDisabled=false;
    1209             :         }
    1210             :     }
    1211             : 
    1212           0 :     return bTheTestFlag;
    1213             : 
    1214             : }
    1215             : 
    1216           0 : bool ScAcceptChgDlg::InsertAcceptedORejected(SvTreeListEntry* pParent)
    1217             : {
    1218           0 :     ScChangeTrack* pChanges=pDoc->GetChangeTrack();
    1219           0 :     bool bTheTestFlag = true;
    1220             : 
    1221           0 :     ScChangeActionState eState = SC_CAS_VIRGIN;
    1222           0 :     OUString aString = pTheView->GetEntryText(pParent);
    1223           0 :     OUString a2String = aString.copy(0, aStrAllAccepted.getLength());
    1224           0 :     if (a2String.equals(aStrAllAccepted))
    1225           0 :         eState=SC_CAS_ACCEPTED;
    1226             :     else
    1227             :     {
    1228           0 :         a2String = aString.copy(0, aStrAllRejected.getLength());
    1229           0 :         if (a2String.equals(aStrAllRejected))
    1230           0 :             eState=SC_CAS_REJECTED;
    1231             :     }
    1232             : 
    1233           0 :     ScChangeAction* pScChangeAction=pChanges->GetFirst();
    1234           0 :     while(pScChangeAction!=NULL)
    1235             :     {
    1236           0 :         if(pScChangeAction->GetState()==eState &&
    1237           0 :             InsertFilteredAction(pScChangeAction,eState,pParent)!=NULL)
    1238           0 :             bTheTestFlag=false;
    1239           0 :         pScChangeAction=pScChangeAction->GetNext();
    1240             :     }
    1241           0 :     return bTheTestFlag;
    1242             : }
    1243             : 
    1244           0 : bool ScAcceptChgDlg::InsertChildren(ScChangeActionMap* pActionMap,SvTreeListEntry* pParent)
    1245             : {
    1246           0 :     ScChangeTrack* pChanges=pDoc->GetChangeTrack();
    1247           0 :     bool bTheTestFlag = true;
    1248           0 :     SvTreeListEntry* pEntry=NULL;
    1249           0 :     ScChangeActionMap::iterator itChangeAction;
    1250             : 
    1251           0 :     for( itChangeAction = pActionMap->begin(); itChangeAction != pActionMap->end(); ++itChangeAction )
    1252             :     {
    1253           0 :         pEntry=InsertChangeAction( itChangeAction->second, SC_CAS_VIRGIN, pParent, false, true );
    1254             : 
    1255           0 :         if(pEntry!=NULL)
    1256             :         {
    1257           0 :             bTheTestFlag=false;
    1258             : 
    1259           0 :             ScRedlinData *pEntryData=(ScRedlinData *)(pEntry->GetUserData());
    1260           0 :             pEntryData->bIsRejectable=false;
    1261           0 :             pEntryData->bIsAcceptable=false;
    1262           0 :             pEntryData->bDisabled=true;
    1263             : 
    1264           0 :             if( itChangeAction->second->IsDialogParent() )
    1265           0 :                 Expand( pChanges, itChangeAction->second, pEntry );
    1266             :         }
    1267             :     }
    1268           0 :     return bTheTestFlag;
    1269             : }
    1270             : 
    1271           0 : bool ScAcceptChgDlg::InsertDeletedChildren(const ScChangeAction* pScChangeAction,
    1272             :                                          ScChangeActionMap* pActionMap,SvTreeListEntry* pParent)
    1273             : {
    1274           0 :     ScChangeTrack* pChanges=pDoc->GetChangeTrack();
    1275           0 :     bool bTheTestFlag = true;
    1276           0 :     SvTreeListEntry* pEntry=NULL;
    1277           0 :     ScChangeActionMap::iterator itChangeAction;
    1278             : 
    1279           0 :     for( itChangeAction = pActionMap->begin(); itChangeAction != pActionMap->end(); ++itChangeAction )
    1280             :     {
    1281             : 
    1282           0 :         if( pScChangeAction != itChangeAction->second )
    1283           0 :             pEntry = InsertChangeAction( itChangeAction->second, SC_CAS_VIRGIN, pParent, false, true );
    1284             :         else
    1285           0 :             pEntry = InsertChangeAction( itChangeAction->second, SC_CAS_VIRGIN, pParent, true, true );
    1286             : 
    1287           0 :         if(pEntry!=NULL)
    1288             :         {
    1289           0 :             ScRedlinData *pEntryData=(ScRedlinData *)(pEntry->GetUserData());
    1290           0 :             pEntryData->bIsRejectable=false;
    1291           0 :             pEntryData->bIsAcceptable=false;
    1292           0 :             pEntryData->bDisabled=true;
    1293             : 
    1294           0 :             bTheTestFlag=false;
    1295             : 
    1296           0 :             if( itChangeAction->second->IsDialogParent() )
    1297           0 :                 Expand( pChanges, itChangeAction->second, pEntry );
    1298             :         }
    1299             :     }
    1300           0 :     return bTheTestFlag;
    1301             : }
    1302             : 
    1303           0 : bool ScAcceptChgDlg::Expand(
    1304             :     ScChangeTrack* pChanges, const ScChangeAction* pScChangeAction,
    1305             :     SvTreeListEntry* pEntry, bool bFilter)
    1306             : {
    1307           0 :     bool bTheTestFlag = true;
    1308             : 
    1309           0 :     if(pChanges!=NULL &&pEntry!=NULL &&pScChangeAction!=NULL)
    1310             :     {
    1311           0 :         ScChangeActionMap aActionMap;
    1312             : 
    1313           0 :         GetDependents( pScChangeAction, aActionMap, pEntry );
    1314             : 
    1315           0 :         switch(pScChangeAction->GetType())
    1316             :         {
    1317             :             case SC_CAT_CONTENT:
    1318             :             {
    1319           0 :                 InsertContentChildren( &aActionMap, pEntry );
    1320           0 :                 bTheTestFlag=!bHasFilterEntry;
    1321           0 :                 break;
    1322             :             }
    1323             :             case SC_CAT_DELETE_COLS:
    1324             :             case SC_CAT_DELETE_ROWS:
    1325             :             case SC_CAT_DELETE_TABS:
    1326             :             {
    1327           0 :                 InsertDeletedChildren( pScChangeAction, &aActionMap, pEntry );
    1328           0 :                 bTheTestFlag=!bHasFilterEntry;
    1329           0 :                 break;
    1330             :             }
    1331             :             default:
    1332             :             {
    1333           0 :                 if(!bFilter)
    1334           0 :                     bTheTestFlag = InsertChildren( &aActionMap, pEntry );
    1335           0 :                 break;
    1336             :             }
    1337             :         }
    1338           0 :         aActionMap.clear();
    1339             :     }
    1340           0 :     return bTheTestFlag;
    1341             : }
    1342             : 
    1343           0 : IMPL_LINK( ScAcceptChgDlg, ExpandingHandle, SvxRedlinTable*, pTable )
    1344             : {
    1345           0 :     ScChangeTrack* pChanges=pDoc->GetChangeTrack();
    1346           0 :     ScChangeAction* pScChangeAction=NULL;
    1347           0 :     SetPointer(Pointer(POINTER_WAIT));
    1348           0 :     if(pTable!=NULL && pChanges!=NULL)
    1349             :     {
    1350           0 :         ScChangeActionMap aActionMap;
    1351           0 :         SvTreeListEntry* pEntry=pTheView->GetHdlEntry();
    1352           0 :         if(pEntry!=NULL)
    1353             :         {
    1354           0 :             ScRedlinData *pEntryData=(ScRedlinData *)(pEntry->GetUserData());
    1355           0 :             if(pEntryData!=NULL)
    1356           0 :                 pScChangeAction=(ScChangeAction*) pEntryData->pData;
    1357             : 
    1358           0 :             if(pEntry->HasChildrenOnDemand())
    1359             :             {
    1360           0 :                 bool bTheTestFlag = true;
    1361           0 :                 pEntry->EnableChildrenOnDemand(false);
    1362           0 :                 SvTreeListEntry* pChildEntry = pTheView->FirstChild(pEntry);
    1363           0 :                 if (pChildEntry)
    1364           0 :                     pTheView->RemoveEntry(pChildEntry);
    1365             : 
    1366           0 :                 if(pEntryData!=NULL)
    1367             :                 {
    1368           0 :                     pScChangeAction=(ScChangeAction*) pEntryData->pData;
    1369             : 
    1370           0 :                     GetDependents( pScChangeAction, aActionMap, pEntry );
    1371             : 
    1372           0 :                     switch(pScChangeAction->GetType())
    1373             :                     {
    1374             :                         case SC_CAT_CONTENT:
    1375             :                         {
    1376           0 :                             bTheTestFlag = InsertContentChildren( &aActionMap, pEntry );
    1377           0 :                             break;
    1378             :                         }
    1379             :                         case SC_CAT_DELETE_COLS:
    1380             :                         case SC_CAT_DELETE_ROWS:
    1381             :                         case SC_CAT_DELETE_TABS:
    1382             :                         {
    1383           0 :                             bTheTestFlag = InsertDeletedChildren( pScChangeAction, &aActionMap, pEntry );
    1384           0 :                             break;
    1385             :                         }
    1386             :                         default:
    1387             :                         {
    1388           0 :                             bTheTestFlag = InsertChildren( &aActionMap, pEntry );
    1389           0 :                             break;
    1390             :                         }
    1391             :                     }
    1392           0 :                     aActionMap.clear();
    1393             : 
    1394             :                 }
    1395             :                 else
    1396             :                 {
    1397           0 :                     bTheTestFlag=InsertAcceptedORejected(pEntry);
    1398             :                 }
    1399           0 :                 if(bTheTestFlag) pTheView->InsertEntry(aStrNoEntry,NULL,Color(COL_GRAY),pEntry);
    1400             :             }
    1401             : 
    1402           0 :         }
    1403             :     }
    1404           0 :     SetPointer(Pointer(POINTER_ARROW));
    1405           0 :     return (sal_uLong) true;
    1406             : }
    1407             : 
    1408           0 : void ScAcceptChgDlg::AppendChanges(ScChangeTrack* pChanges,sal_uLong nStartAction,
    1409             :                                    sal_uLong nEndAction, sal_uLong /* nPos */)
    1410             : {
    1411           0 :     if(pChanges!=NULL)
    1412             :     {
    1413           0 :         SvTreeListEntry* pParent=NULL;
    1414           0 :         const ScChangeAction* pScChangeAction=NULL;
    1415           0 :         bAcceptEnableFlag=true;
    1416           0 :         bRejectEnableFlag=true;
    1417           0 :         SetPointer(Pointer(POINTER_WAIT));
    1418           0 :         pTheView->SetUpdateMode(false);
    1419             : 
    1420           0 :         bool bTheFlag = false;
    1421             : 
    1422           0 :         bool bFilterFlag = pTPFilter->IsDate() || pTPFilter->IsRange() ||
    1423           0 :             pTPFilter->IsAuthor() || pTPFilter->IsComment();
    1424             : 
    1425           0 :         bUseColor = bFilterFlag;
    1426             : 
    1427           0 :         for(sal_uLong i=nStartAction;i<=nEndAction;i++)
    1428             :         {
    1429           0 :             pScChangeAction=pChanges->GetAction(i);
    1430           0 :             if(pScChangeAction==NULL) continue;
    1431             : 
    1432           0 :             switch(pScChangeAction->GetState())
    1433             :             {
    1434             :                 case SC_CAS_VIRGIN:
    1435             : 
    1436           0 :                     if(pScChangeAction->IsDialogRoot())
    1437             :                     {
    1438           0 :                         if(pScChangeAction->IsDialogParent())
    1439           0 :                             pParent=InsertChangeAction(pScChangeAction,SC_CAS_VIRGIN);
    1440             :                         else
    1441           0 :                             pParent=InsertFilteredAction(pScChangeAction,SC_CAS_VIRGIN);
    1442             :                     }
    1443             :                     else
    1444           0 :                         pParent=NULL;
    1445             : 
    1446           0 :                     bTheFlag=true;
    1447           0 :                     break;
    1448             : 
    1449             :                 case SC_CAS_ACCEPTED:
    1450           0 :                     pParent=NULL;
    1451           0 :                     nAcceptCount++;
    1452           0 :                     break;
    1453             : 
    1454             :                 case SC_CAS_REJECTED:
    1455           0 :                     pParent=NULL;
    1456           0 :                     nRejectCount++;
    1457           0 :                     break;
    1458             :             }
    1459             : 
    1460           0 :             if(pParent!=NULL && pScChangeAction->IsDialogParent())
    1461             :             {
    1462           0 :                 if(!bFilterFlag)
    1463           0 :                     pParent->EnableChildrenOnDemand(true);
    1464             :                 else
    1465             :                 {
    1466           0 :                     bool bTestFlag = bHasFilterEntry;
    1467           0 :                     bHasFilterEntry = false;
    1468           0 :                     if(Expand(pChanges,pScChangeAction,pParent,!bTestFlag)&&!bTestFlag)
    1469           0 :                         pTheView->RemoveEntry(pParent);
    1470             :                 }
    1471             :             }
    1472             :         }
    1473             : 
    1474           0 :         if( bTheFlag && (!pDoc->IsDocEditable() || pChanges->IsProtected()) )
    1475           0 :             bTheFlag=false;
    1476             : 
    1477           0 :         pTPView->EnableAccept(bTheFlag);
    1478           0 :         pTPView->EnableAcceptAll(bTheFlag);
    1479           0 :         pTPView->EnableReject(bTheFlag);
    1480           0 :         pTPView->EnableRejectAll(bTheFlag);
    1481             : 
    1482           0 :         pTheView->SetUpdateMode(true);
    1483           0 :         SetPointer(Pointer(POINTER_ARROW));
    1484             :     }
    1485           0 : }
    1486             : 
    1487           0 : void ScAcceptChgDlg::RemoveEntrys(sal_uLong nStartAction,sal_uLong nEndAction)
    1488             : {
    1489             : 
    1490           0 :     pTheView->SetUpdateMode(false);
    1491             : 
    1492           0 :     SvTreeListEntry* pEntry=pTheView->GetCurEntry();
    1493             : 
    1494           0 :     ScRedlinData *pEntryData=NULL;
    1495             : 
    1496           0 :     if(pEntry!=NULL)
    1497           0 :         pEntryData=(ScRedlinData *)(pEntry->GetUserData());
    1498             : 
    1499           0 :     sal_uLong nAction=0;
    1500           0 :     if(pEntryData!=NULL)
    1501           0 :         nAction=pEntryData->nActionNo;
    1502             : 
    1503           0 :     if(nAction>=nStartAction && nAction<=nEndAction)
    1504           0 :         pTheView->SetCurEntry(pTheView->GetModel()->GetEntry(0));
    1505             : 
    1506           0 :     bool bRemove = false;
    1507             : 
    1508             :     // MUST do it backwards, don't delete parents before children and GPF
    1509           0 :     pEntry=pTheView->Last();
    1510           0 :     while(pEntry!=NULL)
    1511             :     {
    1512           0 :         bRemove=false;
    1513           0 :         pEntryData=(ScRedlinData *)(pEntry->GetUserData());
    1514           0 :         if(pEntryData!=NULL)
    1515             :         {
    1516           0 :             nAction=pEntryData->nActionNo;
    1517             : 
    1518           0 :             if(nStartAction<=nAction && nAction<=nEndAction) bRemove=true;
    1519             : 
    1520             :         }
    1521           0 :         SvTreeListEntry* pPrevEntry = pTheView->Prev(pEntry);
    1522             : 
    1523           0 :         if(bRemove)
    1524           0 :             pTheView->RemoveEntry(pEntry);
    1525             : 
    1526           0 :         pEntry=pPrevEntry;
    1527             :     }
    1528           0 :     pTheView->SetUpdateMode(true);
    1529             : 
    1530           0 : }
    1531             : 
    1532           0 : void ScAcceptChgDlg::UpdateEntrys(ScChangeTrack* pChgTrack, sal_uLong nStartAction,sal_uLong nEndAction)
    1533             : {
    1534           0 :     pTheView->SetUpdateMode(false);
    1535             : 
    1536           0 :     sal_uLong nPos=TREELIST_APPEND;
    1537             : 
    1538           0 :     bool bRemove = false;
    1539             : 
    1540           0 :     SvTreeListEntry* pEntry=pTheView->First();
    1541           0 :     SvTreeListEntry* pNextEntry = (pEntry ? pTheView->NextSibling(pEntry) : NULL);
    1542           0 :     SvTreeListEntry* pLastEntry=NULL;
    1543           0 :     while(pEntry!=NULL)
    1544             :     {
    1545           0 :         bRemove=false;
    1546           0 :         ScRedlinData *pEntryData=(ScRedlinData *)(pEntry->GetUserData());
    1547           0 :         if(pEntryData!=NULL)
    1548             :         {
    1549             :             ScChangeAction* pScChangeAction=
    1550           0 :                     (ScChangeAction*) pEntryData->pData;
    1551             : 
    1552           0 :             sal_uLong nAction=pScChangeAction->GetActionNumber();
    1553             : 
    1554           0 :             if(nStartAction<=nAction && nAction<=nEndAction) bRemove=true;
    1555             :         }
    1556             : 
    1557           0 :         if(bRemove)
    1558             :         {
    1559           0 :             nPos=pEntry->GetChildListPos();
    1560           0 :             pTheView->RemoveEntry(pEntry);
    1561             : 
    1562           0 :             if(pLastEntry==NULL) pLastEntry=pTheView->First();
    1563           0 :             if(pLastEntry!=NULL)
    1564             :             {
    1565           0 :                 pNextEntry=pTheView->Next(pLastEntry);
    1566             : 
    1567           0 :                 if(pNextEntry==NULL)
    1568             :                 {
    1569           0 :                     pNextEntry=pLastEntry;
    1570           0 :                     pLastEntry=NULL;
    1571             :                 }
    1572             :             }
    1573             :             else
    1574           0 :                 pNextEntry=NULL;
    1575             : 
    1576             :         }
    1577             :         else
    1578             :         {
    1579           0 :             pLastEntry = pEntry;
    1580           0 :             pNextEntry = pTheView->Next(pEntry);
    1581             :         }
    1582           0 :         pEntry=pNextEntry;
    1583             :     }
    1584             : 
    1585           0 :     if(nStartAction==nEndAction)
    1586           0 :         AppendChanges(pChgTrack,nStartAction,nEndAction,nPos);
    1587             :     else
    1588           0 :         AppendChanges(pChgTrack,nStartAction,nEndAction);
    1589             : 
    1590           0 :     pTheView->SetUpdateMode(true);
    1591             : 
    1592           0 : }
    1593             : 
    1594           0 : IMPL_LINK( ScAcceptChgDlg, ChgTrackModHdl, ScChangeTrack*, pChgTrack)
    1595             : {
    1596           0 :     ScChangeTrackMsgQueue::iterator iter;
    1597           0 :     ScChangeTrackMsgQueue& aMsgQueue= pChgTrack->GetMsgQueue();
    1598             : 
    1599             :     sal_uLong   nStartAction;
    1600             :     sal_uLong   nEndAction;
    1601             : 
    1602           0 :     for (iter = aMsgQueue.begin(); iter != aMsgQueue.end(); ++iter)
    1603             :     {
    1604           0 :         nStartAction=(*iter)->nStartAction;
    1605           0 :         nEndAction=(*iter)->nEndAction;
    1606             : 
    1607           0 :         if(!bIgnoreMsg)
    1608             :         {
    1609           0 :             bNoSelection=true;
    1610             : 
    1611           0 :             switch((*iter)->eMsgType)
    1612             :             {
    1613           0 :                 case SC_CTM_APPEND: AppendChanges(pChgTrack,nStartAction,nEndAction);
    1614           0 :                                     break;
    1615           0 :                 case SC_CTM_REMOVE: RemoveEntrys(nStartAction,nEndAction);
    1616           0 :                                     break;
    1617             :                 case SC_CTM_PARENT:
    1618             :                 case SC_CTM_CHANGE: //bNeedsUpdate=true;
    1619           0 :                                     UpdateEntrys(pChgTrack,nStartAction,nEndAction);
    1620           0 :                                     break;
    1621             :                 default:
    1622             :                 {
    1623             :                     // added to avoid warnings
    1624             :                 }
    1625             :             }
    1626             :         }
    1627           0 :         delete *iter;
    1628             :     }
    1629             : 
    1630           0 :     aMsgQueue.clear();
    1631             : 
    1632           0 :     return 0;
    1633             : }
    1634           0 : IMPL_LINK_NOARG(ScAcceptChgDlg, ReOpenTimerHdl)
    1635             : {
    1636           0 :     ScSimpleRefDlgWrapper::SetAutoReOpen(true);
    1637           0 :     m_pAcceptChgCtr->ShowFilterPage();
    1638           0 :     RefHandle(NULL);
    1639             : 
    1640           0 :     return 0;
    1641             : }
    1642             : 
    1643           0 : IMPL_LINK_NOARG(ScAcceptChgDlg, UpdateSelectionHdl)
    1644             : {
    1645           0 :     ScTabView* pTabView = pViewData->GetView();
    1646             : 
    1647           0 :     bool bAcceptFlag = true;
    1648           0 :     bool bRejectFlag = true;
    1649           0 :     bool bContMark = false;
    1650             : 
    1651           0 :     pTabView->DoneBlockMode();  // clears old marking
    1652           0 :     SvTreeListEntry* pEntry = pTheView->FirstSelected();
    1653           0 :     while( pEntry )
    1654             :     {
    1655           0 :         ScRedlinData* pEntryData = (ScRedlinData*) pEntry->GetUserData();
    1656           0 :         if( pEntryData )
    1657             :         {
    1658           0 :             bRejectFlag &= (bool) pEntryData->bIsRejectable;
    1659           0 :             bAcceptFlag &= (bool) pEntryData->bIsAcceptable;
    1660             : 
    1661           0 :             const ScChangeAction* pScChangeAction = (ScChangeAction*) pEntryData->pData;
    1662           0 :             if( pScChangeAction && (pScChangeAction->GetType() != SC_CAT_DELETE_TABS) &&
    1663           0 :                     (!pEntryData->bDisabled || pScChangeAction->IsVisible()) )
    1664             :             {
    1665           0 :                 const ScBigRange& rBigRange = pScChangeAction->GetBigRange();
    1666           0 :                 if( rBigRange.IsValid( pDoc ) && IsActive() )
    1667             :                 {
    1668           0 :                     bool bSetCursor = !pTheView->NextSelected( pEntry );
    1669           0 :                     pTabView->MarkRange( rBigRange.MakeRange(), bSetCursor, bContMark );
    1670           0 :                     bContMark = true;
    1671             :                 }
    1672             :             }
    1673             :         }
    1674             :         else
    1675             :         {
    1676           0 :             bAcceptFlag = false;
    1677           0 :             bRejectFlag = false;
    1678             :         }
    1679           0 :         bAcceptEnableFlag = bAcceptFlag;
    1680           0 :         bRejectEnableFlag = bRejectFlag;
    1681             : 
    1682           0 :         pEntry = pTheView->NextSelected( pEntry );
    1683             :     }
    1684             : 
    1685           0 :     ScChangeTrack* pChanges = pDoc->GetChangeTrack();
    1686           0 :     bool bEnable = pDoc->IsDocEditable() && pChanges && !pChanges->IsProtected();
    1687           0 :     pTPView->EnableAccept( bAcceptFlag && bEnable );
    1688           0 :     pTPView->EnableReject( bRejectFlag && bEnable );
    1689             : 
    1690           0 :     return 0;
    1691             : }
    1692             : 
    1693           0 : IMPL_LINK_NOARG(ScAcceptChgDlg, CommandHdl)
    1694             : {
    1695             : 
    1696           0 :     const CommandEvent aCEvt(pTheView->GetCommandEvent());
    1697             : 
    1698           0 :     if(aCEvt.GetCommand()==COMMAND_CONTEXTMENU)
    1699             :     {
    1700           0 :         ScPopupMenu aPopup(ScResId(RID_POPUP_CHANGES));
    1701             : 
    1702           0 :         aPopup.SetMenuFlags(MENU_FLAG_HIDEDISABLEDENTRIES);
    1703             : 
    1704           0 :         SvTreeListEntry* pEntry=pTheView->GetCurEntry();
    1705           0 :         if(pEntry!=NULL)
    1706             :         {
    1707           0 :             pTheView->Select(pEntry);
    1708             :         }
    1709             :         else
    1710             :         {
    1711           0 :             aPopup.Deactivate();
    1712             :         }
    1713             : 
    1714           0 :         sal_uInt16 nSortedCol= pTheView->GetSortedCol();
    1715             : 
    1716           0 :         if(nSortedCol!=0xFFFF)
    1717             :         {
    1718           0 :             sal_uInt16 nItemId=nSortedCol+SC_SUB_SORT+1;
    1719             : 
    1720           0 :             aPopup.CheckItem(nItemId);
    1721             : 
    1722           0 :             PopupMenu *pSubMenu = aPopup.GetPopupMenu(SC_SUB_SORT);
    1723             : 
    1724           0 :             if (pSubMenu)
    1725           0 :                 pSubMenu->CheckItem(nItemId);
    1726             :         }
    1727             : 
    1728           0 :         aPopup.EnableItem(SC_CHANGES_COMMENT,false);
    1729             : 
    1730           0 :         if(pDoc->IsDocEditable() && pEntry!=NULL)
    1731             :         {
    1732           0 :             ScRedlinData *pEntryData=(ScRedlinData *)(pEntry->GetUserData());
    1733           0 :             if(pEntryData!=NULL)
    1734             :             {
    1735             :                 ScChangeAction* pScChangeAction=
    1736           0 :                         (ScChangeAction*) pEntryData->pData;
    1737           0 :                 if(pScChangeAction!=NULL && !pTheView->GetParent(pEntry))
    1738           0 :                     aPopup.EnableItem(SC_CHANGES_COMMENT);
    1739             :             }
    1740             :         }
    1741             : 
    1742           0 :         sal_uInt16 nCommand=aPopup.Execute( this, GetPointerPosPixel() );
    1743             : 
    1744           0 :         if(nCommand)
    1745             :         {
    1746           0 :             if(nCommand==SC_CHANGES_COMMENT)
    1747             :             {
    1748           0 :                 if(pEntry!=NULL)
    1749             :                 {
    1750           0 :                     ScRedlinData *pEntryData=(ScRedlinData *)(pEntry->GetUserData());
    1751           0 :                     if(pEntryData!=NULL)
    1752             :                     {
    1753             :                         ScChangeAction* pScChangeAction=
    1754           0 :                                 (ScChangeAction*) pEntryData->pData;
    1755             : 
    1756           0 :                         pViewData->GetDocShell()->ExecuteChangeCommentDialog( pScChangeAction, this,false);
    1757             :                     }
    1758             :                 }
    1759             :             }
    1760             :             else
    1761             :             {
    1762           0 :                 bool bSortDir = pTheView->GetSortDirection();
    1763           0 :                 sal_uInt16 nDialogCol=nCommand-SC_SUB_SORT-1;
    1764           0 :                 if(nSortedCol==nDialogCol) bSortDir=!bSortDir;
    1765           0 :                 pTheView->SortByCol(nDialogCol,bSortDir);
    1766             :                 /*
    1767             :                 SC_SUB_SORT
    1768             :                 SC_SORT_ACTION
    1769             :                 SC_SORT_POSITION
    1770             :                 SC_SORT_AUTHOR
    1771             :                 SC_SORT_DATE
    1772             :                 SC_SORT_COMMENT
    1773             :                 */
    1774             :             }
    1775           0 :         }
    1776             :     }
    1777           0 :     return 0;
    1778             : }
    1779             : 
    1780           0 : void ScAcceptChgDlg::Initialize(SfxChildWinInfo *pInfo)
    1781             : {
    1782           0 :     OUString aStr;
    1783           0 :     if(pInfo!=NULL)
    1784             :     {
    1785           0 :         if ( !pInfo->aExtraString.isEmpty() )
    1786             :         {
    1787           0 :             sal_Int32 nPos = pInfo->aExtraString.indexOf("AcceptChgDat:");
    1788             : 
    1789             :             // Try to read the alignment string "ALIGN:(...)"; if it is missing
    1790             :             // we have an old version
    1791           0 :             if ( nPos != -1 )
    1792             :             {
    1793           0 :                 sal_Int32 n1 = pInfo->aExtraString.indexOf('(', nPos);
    1794           0 :                 if ( n1 != -1 )
    1795             :                 {
    1796           0 :                     sal_Int32 n2 = pInfo->aExtraString.indexOf(')', n1);
    1797           0 :                     if ( n2 != -1 )
    1798             :                     {
    1799             :                         // cut out alignment string
    1800           0 :                         aStr = pInfo->aExtraString.copy(nPos, n2 - nPos + 1);
    1801           0 :                         pInfo->aExtraString = pInfo->aExtraString.replaceAt(nPos, n2 - nPos + 1, "");
    1802           0 :                         aStr = aStr.copy( n1-nPos+1 );
    1803             :                     }
    1804             :                 }
    1805             :             }
    1806             :         }
    1807             :     }
    1808           0 :     SfxModelessDialog::Initialize(pInfo);
    1809             : 
    1810           0 :     if ( !aStr.isEmpty())
    1811             :     {
    1812           0 :         sal_uInt16 nCount=(sal_uInt16)aStr.toInt32();
    1813             : 
    1814           0 :         for(sal_uInt16 i=0;i<nCount;i++)
    1815             :         {
    1816           0 :             sal_Int32 n1 = aStr.indexOf(';');
    1817           0 :             aStr = aStr.copy( n1+1 );
    1818           0 :             pTheView->SetTab(i, (sal_uInt16)aStr.toInt32(), MAP_PIXEL);
    1819             :         }
    1820           0 :     }
    1821           0 : }
    1822             : 
    1823           0 : void ScAcceptChgDlg::FillInfo(SfxChildWinInfo& rInfo) const
    1824             : {
    1825           0 :     SfxModelessDialog::FillInfo(rInfo);
    1826           0 :     rInfo.aExtraString += "AcceptChgDat:(";
    1827             : 
    1828           0 :     sal_uInt16  nCount=pTheView->TabCount();
    1829             : 
    1830           0 :     rInfo.aExtraString += OUString::number(nCount);
    1831           0 :     rInfo.aExtraString += ";";
    1832           0 :     for(sal_uInt16 i=0;i<nCount;i++)
    1833             :     {
    1834           0 :         rInfo.aExtraString += OUString::number(pTheView->GetTab(i));
    1835           0 :         rInfo.aExtraString += ";";
    1836             :     }
    1837           0 :     rInfo.aExtraString += ")";
    1838           0 : }
    1839             : 
    1840           0 : void ScAcceptChgDlg::InitFilter()
    1841             : {
    1842           0 :     if(pTPFilter->IsDate()||pTPFilter->IsRange()||
    1843           0 :         pTPFilter->IsAuthor()||pTPFilter->IsComment())
    1844             :     {
    1845           0 :         pTheView->SetFilterDate(pTPFilter->IsDate());
    1846           0 :         pTheView->SetDateTimeMode(pTPFilter->GetDateMode());
    1847           0 :         pTheView->SetFirstDate(pTPFilter->GetFirstDate());
    1848           0 :         pTheView->SetLastDate(pTPFilter->GetLastDate());
    1849           0 :         pTheView->SetFirstTime(pTPFilter->GetFirstTime());
    1850           0 :         pTheView->SetLastTime(pTPFilter->GetLastTime());
    1851           0 :         pTheView->SetFilterAuthor(pTPFilter->IsAuthor());
    1852           0 :         pTheView->SetAuthor(pTPFilter->GetSelectedAuthor());
    1853             : 
    1854           0 :         pTheView->SetFilterComment(pTPFilter->IsComment());
    1855             : 
    1856             :         utl::SearchParam aSearchParam( pTPFilter->GetComment(),
    1857           0 :                 utl::SearchParam::SRCH_REGEXP,false,false,false );
    1858             : 
    1859           0 :         pTheView->SetCommentParams(&aSearchParam);
    1860             : 
    1861           0 :         pTheView->UpdateFilterTest();
    1862             :     }
    1863           0 : }
    1864             : 
    1865           0 : IMPL_LINK_NOARG(ScAcceptChgDlg, FilterModified)
    1866             : {
    1867           0 :     return 0;
    1868             : }
    1869             : 
    1870             : #define CALC_DATE       3
    1871             : #define CALC_POS        1
    1872             : 
    1873           0 : IMPL_LINK( ScAcceptChgDlg, ColCompareHdl, SvSortData*, pSortData )
    1874             : {
    1875           0 :     sal_Int32 nCompare = 0;
    1876           0 :     SCCOL nSortCol= static_cast<SCCOL>(pTheView->GetSortedCol());
    1877             : 
    1878           0 :     if(pSortData)
    1879             :     {
    1880           0 :         SvTreeListEntry* pLeft = (SvTreeListEntry*)(pSortData->pLeft );
    1881           0 :         SvTreeListEntry* pRight = (SvTreeListEntry*)(pSortData->pRight );
    1882             : 
    1883           0 :         if(CALC_DATE==nSortCol)
    1884             :         {
    1885           0 :             RedlinData *pLeftData=(RedlinData *)(pLeft->GetUserData());
    1886           0 :             RedlinData *pRightData=(RedlinData *)(pRight->GetUserData());
    1887             : 
    1888           0 :             if(pLeftData!=NULL && pRightData!=NULL)
    1889             :             {
    1890           0 :                 if(pLeftData->aDateTime < pRightData->aDateTime)
    1891           0 :                     nCompare = -1;
    1892           0 :                 else if(pLeftData->aDateTime > pRightData->aDateTime)
    1893           0 :                     nCompare = 1;
    1894           0 :                 return nCompare;
    1895             :             }
    1896             :         }
    1897           0 :         else if(CALC_POS==nSortCol)
    1898             :         {
    1899           0 :             ScRedlinData *pLeftData=(ScRedlinData *)(pLeft->GetUserData());
    1900           0 :             ScRedlinData *pRightData=(ScRedlinData *)(pRight->GetUserData());
    1901             : 
    1902           0 :             if(pLeftData!=NULL && pRightData!=NULL)
    1903             :             {
    1904           0 :                 nCompare = 1;
    1905             : 
    1906           0 :                 if(pLeftData->nTable < pRightData->nTable)
    1907           0 :                     nCompare = -1;
    1908           0 :                 else if(pLeftData->nTable == pRightData->nTable)
    1909             :                 {
    1910           0 :                     if(pLeftData->nRow < pRightData->nRow)
    1911           0 :                         nCompare = -1;
    1912           0 :                     else if(pLeftData->nRow == pRightData->nRow)
    1913             :                     {
    1914           0 :                         if(pLeftData->nCol < pRightData->nCol)
    1915           0 :                             nCompare = -1;
    1916           0 :                         else if(pLeftData->nCol == pRightData->nCol)
    1917           0 :                             nCompare = 0;
    1918             :                     }
    1919             :                 }
    1920             : 
    1921           0 :                 return nCompare;
    1922             :             }
    1923             :         }
    1924             : 
    1925           0 :         SvLBoxItem* pLeftItem = pTheView->GetEntryAtPos( pLeft, static_cast<sal_uInt16>(nSortCol));
    1926           0 :         SvLBoxItem* pRightItem = pTheView->GetEntryAtPos( pRight, static_cast<sal_uInt16>(nSortCol));
    1927             : 
    1928           0 :         if(pLeftItem != NULL && pRightItem != NULL)
    1929             :         {
    1930           0 :             sal_uInt16 nLeftKind = pLeftItem->GetType();
    1931           0 :             sal_uInt16 nRightKind = pRightItem->GetType();
    1932             : 
    1933           0 :             if(nRightKind == SV_ITEM_ID_LBOXSTRING &&
    1934             :                 nLeftKind == SV_ITEM_ID_LBOXSTRING )
    1935             :             {
    1936             :                 nCompare = ScGlobal::GetCaseCollator()->compareString(
    1937             :                                         static_cast<SvLBoxString*>(pLeftItem)->GetText(),
    1938           0 :                                         static_cast<SvLBoxString*>(pRightItem)->GetText());
    1939             : 
    1940           0 :                 if (nCompare == 0)
    1941           0 :                     nCompare = -1;
    1942             :             }
    1943             :         }
    1944             : 
    1945             :     }
    1946           0 :     return nCompare;
    1947         228 : }
    1948             : 
    1949             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10