LCOV - code coverage report
Current view: top level - sc/source/ui/miscdlgs - acredlin.cxx (source / functions) Hit Total Coverage
Test: commit c8344322a7af75b84dd3ca8f78b05543a976dfd5 Lines: 1 1064 0.1 %
Date: 2015-06-13 12:38:46 Functions: 2 61 3.3 %
Legend: Lines: hit not hit

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

Generated by: LCOV version 1.11