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

Generated by: LCOV version 1.10