LCOV - code coverage report
Current view: top level - sc/source/ui/undo - undodat.cxx (source / functions) Hit Total Coverage
Test: libreoffice_filtered.info Lines: 111 1032 10.8 %
Date: 2012-08-25 Functions: 38 226 16.8 %
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: 89 1136 7.8 %

           Branch data     Line data    Source code
       1                 :            : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       2                 :            : /*************************************************************************
       3                 :            :  *
       4                 :            :  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
       5                 :            :  *
       6                 :            :  * Copyright 2000, 2010 Oracle and/or its affiliates.
       7                 :            :  *
       8                 :            :  * OpenOffice.org - a multi-platform office productivity suite
       9                 :            :  *
      10                 :            :  * This file is part of OpenOffice.org.
      11                 :            :  *
      12                 :            :  * OpenOffice.org is free software: you can redistribute it and/or modify
      13                 :            :  * it under the terms of the GNU Lesser General Public License version 3
      14                 :            :  * only, as published by the Free Software Foundation.
      15                 :            :  *
      16                 :            :  * OpenOffice.org is distributed in the hope that it will be useful,
      17                 :            :  * but WITHOUT ANY WARRANTY; without even the implied warranty of
      18                 :            :  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      19                 :            :  * GNU Lesser General Public License version 3 for more details
      20                 :            :  * (a copy is included in the LICENSE file that accompanied this code).
      21                 :            :  *
      22                 :            :  * You should have received a copy of the GNU Lesser General Public License
      23                 :            :  * version 3 along with OpenOffice.org.  If not, see
      24                 :            :  * <http://www.openoffice.org/license.html>
      25                 :            :  * for a copy of the LGPLv3 License.
      26                 :            :  *
      27                 :            :  ************************************************************************/
      28                 :            : 
      29                 :            : #include <sfx2/app.hxx>
      30                 :            : 
      31                 :            : #include "undodat.hxx"
      32                 :            : #include "undoutil.hxx"
      33                 :            : #include "undoolk.hxx"
      34                 :            : #include "document.hxx"
      35                 :            : #include "docsh.hxx"
      36                 :            : #include "tabvwsh.hxx"
      37                 :            : #include "olinetab.hxx"
      38                 :            : #include "dbdata.hxx"
      39                 :            : #include "rangenam.hxx"
      40                 :            : #include "pivot.hxx"
      41                 :            : #include "globstr.hrc"
      42                 :            : #include "global.hxx"
      43                 :            : #include "globalnames.hxx"
      44                 :            : #include "target.hxx"
      45                 :            : #include "chartarr.hxx"
      46                 :            : #include "dbdocfun.hxx"
      47                 :            : #include "olinefun.hxx"
      48                 :            : #include "dpobject.hxx"
      49                 :            : #include "attrib.hxx"
      50                 :            : #include "hints.hxx"
      51                 :            : #include "sc.hrc"
      52                 :            : #include "chgtrack.hxx"
      53                 :            : #include "refundo.hxx"
      54                 :            : #include "markdata.hxx"
      55                 :            : 
      56                 :            : // -----------------------------------------------------------------------
      57                 :            : 
      58 [ #  # ][ #  # ]:          0 : TYPEINIT1(ScUndoDoOutline,          ScSimpleUndo);
      59 [ #  # ][ #  # ]:          0 : TYPEINIT1(ScUndoMakeOutline,        ScSimpleUndo);
      60 [ #  # ][ #  # ]:          0 : TYPEINIT1(ScUndoOutlineLevel,       ScSimpleUndo);
      61 [ #  # ][ #  # ]:          0 : TYPEINIT1(ScUndoOutlineBlock,       ScSimpleUndo);
      62 [ #  # ][ #  # ]:          0 : TYPEINIT1(ScUndoRemoveAllOutlines,  ScSimpleUndo);
      63 [ #  # ][ #  # ]:          0 : TYPEINIT1(ScUndoAutoOutline,        ScSimpleUndo);
      64 [ #  # ][ #  # ]:          0 : TYPEINIT1(ScUndoSubTotals,          ScDBFuncUndo);
      65 [ #  # ][ #  # ]:          0 : TYPEINIT1(ScUndoSort,               ScDBFuncUndo);
      66 [ #  # ][ #  # ]:          0 : TYPEINIT1(ScUndoQuery,              ScDBFuncUndo);
      67 [ #  # ][ #  # ]:          0 : TYPEINIT1(ScUndoAutoFilter,         ScDBFuncUndo);
      68 [ #  # ][ #  # ]:          0 : TYPEINIT1(ScUndoDBData,             ScSimpleUndo);
      69 [ #  # ][ #  # ]:          0 : TYPEINIT1(ScUndoImportData,         ScSimpleUndo);
      70 [ #  # ][ #  # ]:          0 : TYPEINIT1(ScUndoRepeatDB,           ScSimpleUndo);
      71 [ #  # ][ #  # ]:          0 : TYPEINIT1(ScUndoDataPilot,          ScSimpleUndo);
      72 [ #  # ][ #  # ]:          0 : TYPEINIT1(ScUndoConsolidate,        ScSimpleUndo);
      73 [ #  # ][ #  # ]:          0 : TYPEINIT1(ScUndoChartData,          ScSimpleUndo);
      74 [ #  # ][ #  # ]:          0 : TYPEINIT1(ScUndoDataForm,           SfxUndoAction);
      75                 :            : 
      76                 :            : // -----------------------------------------------------------------------
      77                 :            : 
      78                 :            : 
      79                 :            : //
      80                 :            : //      Outline-Gruppen ein- oder ausblenden
      81                 :            : //
      82                 :            : 
      83                 :          0 : ScUndoDoOutline::ScUndoDoOutline( ScDocShell* pNewDocShell,
      84                 :            :                             SCCOLROW nNewStart, SCCOLROW nNewEnd, SCTAB nNewTab,
      85                 :            :                             ScDocument* pNewUndoDoc, sal_Bool bNewColumns,
      86                 :            :                             sal_uInt16 nNewLevel, sal_uInt16 nNewEntry, sal_Bool bNewShow ) :
      87                 :            :     ScSimpleUndo( pNewDocShell ),
      88                 :            :     nStart( nNewStart ),
      89                 :            :     nEnd( nNewEnd ),
      90                 :            :     nTab( nNewTab ),
      91                 :            :     pUndoDoc( pNewUndoDoc ),
      92                 :            :     bColumns( bNewColumns ),
      93                 :            :     nLevel( nNewLevel ),
      94                 :            :     nEntry( nNewEntry ),
      95                 :          0 :     bShow( bNewShow )
      96                 :            : {
      97                 :          0 : }
      98                 :            : 
      99                 :          0 : ScUndoDoOutline::~ScUndoDoOutline()
     100                 :            : {
     101 [ #  # ][ #  # ]:          0 :     delete pUndoDoc;
     102         [ #  # ]:          0 : }
     103                 :            : 
     104                 :          0 : rtl::OUString ScUndoDoOutline::GetComment() const
     105                 :            : {   // Detail einblenden" "Detail ausblenden"
     106                 :            :     return bShow ?
     107                 :            :         ScGlobal::GetRscString( STR_UNDO_DOOUTLINE ) :
     108         [ #  # ]:          0 :         ScGlobal::GetRscString( STR_UNDO_REDOOUTLINE );
     109                 :            : }
     110                 :            : 
     111                 :          0 : void ScUndoDoOutline::Undo()
     112                 :            : {
     113                 :          0 :     BeginUndo();
     114                 :            : 
     115                 :          0 :     ScDocument* pDoc = pDocShell->GetDocument();
     116                 :          0 :     ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
     117                 :            : 
     118                 :            :     //  Tabelle muss vorher umgeschaltet sein (#46952#) !!!
     119                 :            : 
     120                 :          0 :     SCTAB nVisTab = pViewShell->GetViewData()->GetTabNo();
     121         [ #  # ]:          0 :     if ( nVisTab != nTab )
     122                 :          0 :         pViewShell->SetTabNo( nTab );
     123                 :            : 
     124                 :            :     //  inverse Funktion ausfuehren
     125                 :            : 
     126         [ #  # ]:          0 :     if (bShow)
     127                 :          0 :         pViewShell->HideOutline( bColumns, nLevel, nEntry, false, false );
     128                 :            :     else
     129                 :          0 :         pViewShell->ShowOutline( bColumns, nLevel, nEntry, false, false );
     130                 :            : 
     131                 :            :     //  Original Spalten-/Zeilenstatus
     132                 :            : 
     133         [ #  # ]:          0 :     if (bColumns)
     134                 :            :         pUndoDoc->CopyToDocument( static_cast<SCCOL>(nStart), 0, nTab,
     135                 :          0 :                 static_cast<SCCOL>(nEnd), MAXROW, nTab, IDF_NONE, false, pDoc);
     136                 :            :     else
     137                 :          0 :         pUndoDoc->CopyToDocument( 0, nStart, nTab, MAXCOL, nEnd, nTab, IDF_NONE, false, pDoc );
     138                 :            : 
     139                 :          0 :     pViewShell->UpdateScrollBars();
     140                 :            : 
     141                 :          0 :     pDocShell->PostPaint(0,0,nTab,MAXCOL,MAXROW,nTab,PAINT_GRID|PAINT_LEFT|PAINT_TOP);
     142                 :            : 
     143                 :          0 :     EndUndo();
     144                 :          0 : }
     145                 :            : 
     146                 :          0 : void ScUndoDoOutline::Redo()
     147                 :            : {
     148                 :          0 :     BeginRedo();
     149                 :            : 
     150                 :          0 :     ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
     151                 :            : 
     152                 :            :     //  Tabelle muss vorher umgeschaltet sein (#46952#) !!!
     153                 :            : 
     154                 :          0 :     SCTAB nVisTab = pViewShell->GetViewData()->GetTabNo();
     155         [ #  # ]:          0 :     if ( nVisTab != nTab )
     156                 :          0 :         pViewShell->SetTabNo( nTab );
     157                 :            : 
     158         [ #  # ]:          0 :     if (bShow)
     159                 :          0 :         pViewShell->ShowOutline( bColumns, nLevel, nEntry, false );
     160                 :            :     else
     161                 :          0 :         pViewShell->HideOutline( bColumns, nLevel, nEntry, false );
     162                 :            : 
     163                 :          0 :     EndRedo();
     164                 :          0 : }
     165                 :            : 
     166                 :          0 : void ScUndoDoOutline::Repeat(SfxRepeatTarget& /* rTarget */)
     167                 :            : {
     168                 :          0 : }
     169                 :            : 
     170                 :          0 : sal_Bool ScUndoDoOutline::CanRepeat(SfxRepeatTarget& /* rTarget */) const
     171                 :            : {
     172                 :          0 :     return false;                       // geht nicht
     173                 :            : }
     174                 :            : 
     175                 :            : //
     176                 :            : //      Outline-Gruppen erzeugen oder loeschen
     177                 :            : //
     178                 :            : 
     179                 :          0 : ScUndoMakeOutline::ScUndoMakeOutline( ScDocShell* pNewDocShell,
     180                 :            :                             SCCOL nStartX, SCROW nStartY, SCTAB nStartZ,
     181                 :            :                             SCCOL nEndX, SCROW nEndY, SCTAB nEndZ,
     182                 :            :                             ScOutlineTable* pNewUndoTab, sal_Bool bNewColumns, sal_Bool bNewMake ) :
     183                 :            :     ScSimpleUndo( pNewDocShell ),
     184                 :            :     aBlockStart( nStartX, nStartY, nStartZ ),
     185                 :            :     aBlockEnd( nEndX, nEndY, nEndZ ),
     186                 :            :     pUndoTable( pNewUndoTab ),
     187                 :            :     bColumns( bNewColumns ),
     188                 :          0 :     bMake( bNewMake )
     189                 :            : {
     190                 :          0 : }
     191                 :            : 
     192                 :          0 : ScUndoMakeOutline::~ScUndoMakeOutline()
     193                 :            : {
     194 [ #  # ][ #  # ]:          0 :     delete pUndoTable;
     195         [ #  # ]:          0 : }
     196                 :            : 
     197                 :          0 : rtl::OUString ScUndoMakeOutline::GetComment() const
     198                 :            : {   // "Gruppierung" "Gruppierung aufheben"
     199                 :            :     return bMake ?
     200                 :            :         ScGlobal::GetRscString( STR_UNDO_MAKEOUTLINE ) :
     201         [ #  # ]:          0 :         ScGlobal::GetRscString( STR_UNDO_REMAKEOUTLINE );
     202                 :            : }
     203                 :            : 
     204                 :          0 : void ScUndoMakeOutline::Undo()
     205                 :            : {
     206                 :          0 :     BeginUndo();
     207                 :            : 
     208                 :          0 :     ScDocument* pDoc = pDocShell->GetDocument();
     209                 :          0 :     ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
     210                 :          0 :     SCTAB nTab = aBlockStart.Tab();
     211                 :            : 
     212                 :          0 :     ScUndoUtil::MarkSimpleBlock( pDocShell, aBlockStart, aBlockEnd );
     213                 :            : 
     214                 :          0 :     pDoc->SetOutlineTable( nTab, pUndoTable );
     215                 :            : 
     216                 :          0 :     SCTAB nVisTab = pViewShell->GetViewData()->GetTabNo();
     217         [ #  # ]:          0 :     if ( nVisTab != nTab )
     218                 :          0 :         pViewShell->SetTabNo( nTab );
     219                 :            : 
     220                 :          0 :     pDocShell->PostPaint(0,0,nTab,MAXCOL,MAXROW,nTab,PAINT_GRID|PAINT_LEFT|PAINT_TOP|PAINT_SIZE);
     221                 :            : 
     222                 :          0 :     EndUndo();
     223                 :          0 : }
     224                 :            : 
     225                 :          0 : void ScUndoMakeOutline::Redo()
     226                 :            : {
     227                 :          0 :     BeginRedo();
     228                 :            : 
     229                 :          0 :     ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
     230                 :            : 
     231                 :          0 :     ScUndoUtil::MarkSimpleBlock( pDocShell, aBlockStart, aBlockEnd );
     232                 :            : 
     233         [ #  # ]:          0 :     if (bMake)
     234                 :          0 :         pViewShell->MakeOutline( bColumns, false );
     235                 :            :     else
     236                 :          0 :         pViewShell->RemoveOutline( bColumns, false );
     237                 :            : 
     238                 :          0 :     pDocShell->PostPaint(0,0,aBlockStart.Tab(),MAXCOL,MAXROW,aBlockEnd.Tab(),PAINT_GRID);
     239                 :            : 
     240                 :          0 :     EndRedo();
     241                 :          0 : }
     242                 :            : 
     243                 :          0 : void ScUndoMakeOutline::Repeat(SfxRepeatTarget& rTarget)
     244                 :            : {
     245         [ #  # ]:          0 :     if (rTarget.ISA(ScTabViewTarget))
     246                 :            :     {
     247                 :          0 :         ScTabViewShell& rViewShell = *((ScTabViewTarget&)rTarget).GetViewShell();
     248                 :            : 
     249         [ #  # ]:          0 :         if (bMake)
     250                 :          0 :             rViewShell.MakeOutline( bColumns, sal_True );
     251                 :            :         else
     252                 :          0 :             rViewShell.RemoveOutline( bColumns, sal_True );
     253                 :            :     }
     254                 :          0 : }
     255                 :            : 
     256                 :          0 : sal_Bool ScUndoMakeOutline::CanRepeat(SfxRepeatTarget& rTarget) const
     257                 :            : {
     258                 :          0 :     return (rTarget.ISA(ScTabViewTarget));
     259                 :            : }
     260                 :            : 
     261                 :            : //
     262                 :            : //      Outline-Ebene auswaehlen
     263                 :            : //
     264                 :            : 
     265                 :          0 : ScUndoOutlineLevel::ScUndoOutlineLevel( ScDocShell* pNewDocShell,
     266                 :            :                         SCCOLROW nNewStart, SCCOLROW nNewEnd, SCTAB nNewTab,
     267                 :            :                         ScDocument* pNewUndoDoc, ScOutlineTable* pNewUndoTab,
     268                 :            :                         sal_Bool bNewColumns, sal_uInt16 nNewLevel ) :
     269                 :            :     ScSimpleUndo( pNewDocShell ),
     270                 :            :     nStart( nNewStart ),
     271                 :            :     nEnd( nNewEnd ),
     272                 :            :     nTab( nNewTab ),
     273                 :            :     pUndoDoc( pNewUndoDoc ),
     274                 :            :     pUndoTable( pNewUndoTab ),
     275                 :            :     bColumns( bNewColumns ),
     276                 :          0 :     nLevel( nNewLevel )
     277                 :            : {
     278                 :          0 : }
     279                 :            : 
     280                 :          0 : ScUndoOutlineLevel::~ScUndoOutlineLevel()
     281                 :            : {
     282 [ #  # ][ #  # ]:          0 :     delete pUndoDoc;
     283 [ #  # ][ #  # ]:          0 :     delete pUndoTable;
     284         [ #  # ]:          0 : }
     285                 :            : 
     286                 :          0 : rtl::OUString ScUndoOutlineLevel::GetComment() const
     287                 :            : {   // "Gliederungsebene auswaehlen";
     288                 :          0 :     return ScGlobal::GetRscString( STR_UNDO_OUTLINELEVEL );
     289                 :            : }
     290                 :            : 
     291                 :          0 : void ScUndoOutlineLevel::Undo()
     292                 :            : {
     293                 :          0 :     BeginUndo();
     294                 :            : 
     295                 :          0 :     ScDocument* pDoc = pDocShell->GetDocument();
     296                 :          0 :     ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
     297                 :            : 
     298                 :            :     //  Original Outline-Table
     299                 :            : 
     300                 :          0 :     pDoc->SetOutlineTable( nTab, pUndoTable );
     301                 :            : 
     302                 :            :     //  Original Spalten-/Zeilenstatus
     303                 :            : 
     304         [ #  # ]:          0 :     if (bColumns)
     305                 :            :         pUndoDoc->CopyToDocument( static_cast<SCCOL>(nStart), 0, nTab,
     306                 :          0 :                 static_cast<SCCOL>(nEnd), MAXROW, nTab, IDF_NONE, false, pDoc);
     307                 :            :     else
     308                 :          0 :         pUndoDoc->CopyToDocument( 0, nStart, nTab, MAXCOL, nEnd, nTab, IDF_NONE, false, pDoc );
     309                 :            : 
     310                 :          0 :     pDoc->UpdatePageBreaks( nTab );
     311                 :            : 
     312                 :          0 :     pViewShell->UpdateScrollBars();
     313                 :            : 
     314                 :          0 :     SCTAB nVisTab = pViewShell->GetViewData()->GetTabNo();
     315         [ #  # ]:          0 :     if ( nVisTab != nTab )
     316                 :          0 :         pViewShell->SetTabNo( nTab );
     317                 :            : 
     318                 :          0 :     pDocShell->PostPaint(0,0,nTab,MAXCOL,MAXROW,nTab,PAINT_GRID|PAINT_LEFT|PAINT_TOP);
     319                 :            : 
     320                 :          0 :     EndUndo();
     321                 :          0 : }
     322                 :            : 
     323                 :          0 : void ScUndoOutlineLevel::Redo()
     324                 :            : {
     325                 :          0 :     BeginRedo();
     326                 :            : 
     327                 :          0 :     ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
     328                 :            : 
     329                 :            :     //  Tabelle muss vorher umgeschaltet sein (#46952#) !!!
     330                 :            : 
     331                 :          0 :     SCTAB nVisTab = pViewShell->GetViewData()->GetTabNo();
     332         [ #  # ]:          0 :     if ( nVisTab != nTab )
     333                 :          0 :         pViewShell->SetTabNo( nTab );
     334                 :            : 
     335                 :          0 :     pViewShell->SelectLevel( bColumns, nLevel, false );
     336                 :            : 
     337                 :          0 :     EndRedo();
     338                 :          0 : }
     339                 :            : 
     340                 :          0 : void ScUndoOutlineLevel::Repeat(SfxRepeatTarget& rTarget)
     341                 :            : {
     342         [ #  # ]:          0 :     if (rTarget.ISA(ScTabViewTarget))
     343                 :          0 :         ((ScTabViewTarget&)rTarget).GetViewShell()->SelectLevel( bColumns, nLevel, sal_True );
     344                 :          0 : }
     345                 :            : 
     346                 :          0 : sal_Bool ScUndoOutlineLevel::CanRepeat(SfxRepeatTarget& rTarget) const
     347                 :            : {
     348                 :          0 :     return (rTarget.ISA(ScTabViewTarget));
     349                 :            : }
     350                 :            : 
     351                 :            : //
     352                 :            : //      Outline ueber Blockmarken ein- oder ausblenden
     353                 :            : //
     354                 :            : 
     355                 :          0 : ScUndoOutlineBlock::ScUndoOutlineBlock( ScDocShell* pNewDocShell,
     356                 :            :                         SCCOL nStartX, SCROW nStartY, SCTAB nStartZ,
     357                 :            :                         SCCOL nEndX, SCROW nEndY, SCTAB nEndZ,
     358                 :            :                         ScDocument* pNewUndoDoc, ScOutlineTable* pNewUndoTab, sal_Bool bNewShow ) :
     359                 :            :     ScSimpleUndo( pNewDocShell ),
     360                 :            :     aBlockStart( nStartX, nStartY, nStartZ ),
     361                 :            :     aBlockEnd( nEndX, nEndY, nEndZ ),
     362                 :            :     pUndoDoc( pNewUndoDoc ),
     363                 :            :     pUndoTable( pNewUndoTab ),
     364                 :          0 :     bShow( bNewShow )
     365                 :            : {
     366                 :          0 : }
     367                 :            : 
     368                 :          0 : ScUndoOutlineBlock::~ScUndoOutlineBlock()
     369                 :            : {
     370 [ #  # ][ #  # ]:          0 :     delete pUndoDoc;
     371 [ #  # ][ #  # ]:          0 :     delete pUndoTable;
     372         [ #  # ]:          0 : }
     373                 :            : 
     374                 :          0 : rtl::OUString ScUndoOutlineBlock::GetComment() const
     375                 :            : {   // "Detail einblenden" "Detail ausblenden"
     376                 :            :     return bShow ?
     377                 :            :         ScGlobal::GetRscString( STR_UNDO_DOOUTLINEBLK ) :
     378         [ #  # ]:          0 :         ScGlobal::GetRscString( STR_UNDO_REDOOUTLINEBLK );
     379                 :            : }
     380                 :            : 
     381                 :          0 : void ScUndoOutlineBlock::Undo()
     382                 :            : {
     383         [ #  # ]:          0 :     BeginUndo();
     384                 :            : 
     385                 :          0 :     ScDocument* pDoc = pDocShell->GetDocument();
     386         [ #  # ]:          0 :     ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
     387                 :          0 :     SCTAB nTab = aBlockStart.Tab();
     388                 :            : 
     389                 :            :     //  Original Outline-Table
     390                 :            : 
     391         [ #  # ]:          0 :     pDoc->SetOutlineTable( nTab, pUndoTable );
     392                 :            : 
     393                 :            :     //  Original Spalten-/Zeilenstatus
     394                 :            : 
     395                 :          0 :     SCCOLROW    nStartCol = aBlockStart.Col();
     396                 :          0 :     SCCOLROW    nEndCol = aBlockEnd.Col();
     397                 :          0 :     SCCOLROW    nStartRow = aBlockStart.Row();
     398                 :          0 :     SCCOLROW    nEndRow = aBlockEnd.Row();
     399                 :            : 
     400         [ #  # ]:          0 :     if (!bShow)
     401                 :            :     {                               //  Groesse des ausgeblendeten Blocks
     402                 :            :         size_t nLevel;
     403         [ #  # ]:          0 :         pUndoTable->GetColArray()->FindTouchedLevel( nStartCol, nEndCol, nLevel );
     404         [ #  # ]:          0 :         pUndoTable->GetColArray()->ExtendBlock( nLevel, nStartCol, nEndCol );
     405         [ #  # ]:          0 :         pUndoTable->GetRowArray()->FindTouchedLevel( nStartRow, nEndRow, nLevel );
     406         [ #  # ]:          0 :         pUndoTable->GetRowArray()->ExtendBlock( nLevel, nStartRow, nEndRow );
     407                 :            :     }
     408                 :            : 
     409                 :            :     pUndoDoc->CopyToDocument( static_cast<SCCOL>(nStartCol), 0, nTab,
     410         [ #  # ]:          0 :             static_cast<SCCOL>(nEndCol), MAXROW, nTab, IDF_NONE, false, pDoc );
     411         [ #  # ]:          0 :     pUndoDoc->CopyToDocument( 0, nStartRow, nTab, MAXCOL, nEndRow, nTab, IDF_NONE, false, pDoc );
     412                 :            : 
     413         [ #  # ]:          0 :     pDoc->UpdatePageBreaks( nTab );
     414                 :            : 
     415         [ #  # ]:          0 :     pViewShell->UpdateScrollBars();
     416                 :            : 
     417                 :          0 :     SCTAB nVisTab = pViewShell->GetViewData()->GetTabNo();
     418         [ #  # ]:          0 :     if ( nVisTab != nTab )
     419         [ #  # ]:          0 :         pViewShell->SetTabNo( nTab );
     420                 :            : 
     421         [ #  # ]:          0 :     pDocShell->PostPaint(0,0,nTab,MAXCOL,MAXROW,nTab,PAINT_GRID|PAINT_LEFT|PAINT_TOP);
     422                 :            : 
     423         [ #  # ]:          0 :     EndUndo();
     424                 :          0 : }
     425                 :            : 
     426                 :          0 : void ScUndoOutlineBlock::Redo()
     427                 :            : {
     428                 :          0 :     BeginRedo();
     429                 :            : 
     430                 :          0 :     ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
     431                 :            : 
     432                 :          0 :     ScUndoUtil::MarkSimpleBlock( pDocShell, aBlockStart, aBlockEnd );
     433         [ #  # ]:          0 :     if (bShow)
     434                 :          0 :         pViewShell->ShowMarkedOutlines( false );
     435                 :            :     else
     436                 :          0 :         pViewShell->HideMarkedOutlines( false );
     437                 :            : 
     438                 :          0 :     EndRedo();
     439                 :          0 : }
     440                 :            : 
     441                 :          0 : void ScUndoOutlineBlock::Repeat(SfxRepeatTarget& rTarget)
     442                 :            : {
     443         [ #  # ]:          0 :     if (rTarget.ISA(ScTabViewTarget))
     444                 :            :     {
     445                 :          0 :         ScTabViewShell& rViewShell = *((ScTabViewTarget&)rTarget).GetViewShell();
     446                 :            : 
     447         [ #  # ]:          0 :         if (bShow)
     448                 :          0 :             rViewShell.ShowMarkedOutlines( sal_True );
     449                 :            :         else
     450                 :          0 :             rViewShell.HideMarkedOutlines( sal_True );
     451                 :            :     }
     452                 :          0 : }
     453                 :            : 
     454                 :          0 : sal_Bool ScUndoOutlineBlock::CanRepeat(SfxRepeatTarget& rTarget) const
     455                 :            : {
     456                 :          0 :     return (rTarget.ISA(ScTabViewTarget));
     457                 :            : }
     458                 :            : 
     459                 :            : //
     460                 :            : //      alle Outlines loeschen
     461                 :            : //
     462                 :            : 
     463                 :          0 : ScUndoRemoveAllOutlines::ScUndoRemoveAllOutlines( ScDocShell* pNewDocShell,
     464                 :            :                                     SCCOL nStartX, SCROW nStartY, SCTAB nStartZ,
     465                 :            :                                     SCCOL nEndX, SCROW nEndY, SCTAB nEndZ,
     466                 :            :                                     ScDocument* pNewUndoDoc, ScOutlineTable* pNewUndoTab ) :
     467                 :            :     ScSimpleUndo( pNewDocShell ),
     468                 :            :     aBlockStart( nStartX, nStartY, nStartZ ),
     469                 :            :     aBlockEnd( nEndX, nEndY, nEndZ ),
     470                 :            :     pUndoDoc( pNewUndoDoc ),
     471                 :          0 :     pUndoTable( pNewUndoTab )
     472                 :            : {
     473                 :          0 : }
     474                 :            : 
     475                 :          0 : ScUndoRemoveAllOutlines::~ScUndoRemoveAllOutlines()
     476                 :            : {
     477 [ #  # ][ #  # ]:          0 :     delete pUndoDoc;
     478 [ #  # ][ #  # ]:          0 :     delete pUndoTable;
     479         [ #  # ]:          0 : }
     480                 :            : 
     481                 :          0 : rtl::OUString ScUndoRemoveAllOutlines::GetComment() const
     482                 :            : {   // "Gliederung entfernen"
     483                 :          0 :     return ScGlobal::GetRscString( STR_UNDO_REMOVEALLOTLNS );
     484                 :            : }
     485                 :            : 
     486                 :          0 : void ScUndoRemoveAllOutlines::Undo()
     487                 :            : {
     488                 :          0 :     BeginUndo();
     489                 :            : 
     490                 :          0 :     ScDocument* pDoc = pDocShell->GetDocument();
     491                 :          0 :     ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
     492                 :          0 :     SCTAB nTab = aBlockStart.Tab();
     493                 :            : 
     494                 :            :     //  Original Outline-Table
     495                 :            : 
     496                 :          0 :     pDoc->SetOutlineTable( nTab, pUndoTable );
     497                 :            : 
     498                 :            :     //  Original Spalten-/Zeilenstatus
     499                 :            : 
     500                 :          0 :     SCCOL   nStartCol = aBlockStart.Col();
     501                 :          0 :     SCCOL   nEndCol = aBlockEnd.Col();
     502                 :          0 :     SCROW   nStartRow = aBlockStart.Row();
     503                 :          0 :     SCROW   nEndRow = aBlockEnd.Row();
     504                 :            : 
     505                 :          0 :     pUndoDoc->CopyToDocument( nStartCol, 0, nTab, nEndCol, MAXROW, nTab, IDF_NONE, false, pDoc );
     506                 :          0 :     pUndoDoc->CopyToDocument( 0, nStartRow, nTab, MAXCOL, nEndRow, nTab, IDF_NONE, false, pDoc );
     507                 :            : 
     508                 :          0 :     pDoc->UpdatePageBreaks( nTab );
     509                 :            : 
     510                 :          0 :     pViewShell->UpdateScrollBars();
     511                 :            : 
     512                 :          0 :     SCTAB nVisTab = pViewShell->GetViewData()->GetTabNo();
     513         [ #  # ]:          0 :     if ( nVisTab != nTab )
     514                 :          0 :         pViewShell->SetTabNo( nTab );
     515                 :            : 
     516                 :          0 :     pDocShell->PostPaint(0,0,nTab,MAXCOL,MAXROW,nTab,PAINT_GRID|PAINT_LEFT|PAINT_TOP|PAINT_SIZE);
     517                 :            : 
     518                 :          0 :     EndUndo();
     519                 :          0 : }
     520                 :            : 
     521                 :          0 : void ScUndoRemoveAllOutlines::Redo()
     522                 :            : {
     523                 :          0 :     BeginRedo();
     524                 :            : 
     525                 :          0 :     ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
     526                 :            : 
     527                 :            :     //  Tabelle muss vorher umgeschaltet sein (#46952#) !!!
     528                 :            : 
     529                 :          0 :     SCTAB nTab = aBlockStart.Tab();
     530                 :          0 :     SCTAB nVisTab = pViewShell->GetViewData()->GetTabNo();
     531         [ #  # ]:          0 :     if ( nVisTab != nTab )
     532                 :          0 :         pViewShell->SetTabNo( nTab );
     533                 :            : 
     534                 :          0 :     pViewShell->RemoveAllOutlines( false );
     535                 :            : 
     536                 :          0 :     EndRedo();
     537                 :          0 : }
     538                 :            : 
     539                 :          0 : void ScUndoRemoveAllOutlines::Repeat(SfxRepeatTarget& rTarget)
     540                 :            : {
     541         [ #  # ]:          0 :     if (rTarget.ISA(ScTabViewTarget))
     542                 :          0 :         ((ScTabViewTarget&)rTarget).GetViewShell()->RemoveAllOutlines( sal_True );
     543                 :          0 : }
     544                 :            : 
     545                 :          0 : sal_Bool ScUndoRemoveAllOutlines::CanRepeat(SfxRepeatTarget& rTarget) const
     546                 :            : {
     547                 :          0 :     return (rTarget.ISA(ScTabViewTarget));
     548                 :            : }
     549                 :            : 
     550                 :            : //
     551                 :            : //      Auto-Outline
     552                 :            : //
     553                 :            : 
     554                 :          0 : ScUndoAutoOutline::ScUndoAutoOutline( ScDocShell* pNewDocShell,
     555                 :            :                                     SCCOL nStartX, SCROW nStartY, SCTAB nStartZ,
     556                 :            :                                     SCCOL nEndX, SCROW nEndY, SCTAB nEndZ,
     557                 :            :                                     ScDocument* pNewUndoDoc, ScOutlineTable* pNewUndoTab ) :
     558                 :            :     ScSimpleUndo( pNewDocShell ),
     559                 :            :     aBlockStart( nStartX, nStartY, nStartZ ),
     560                 :            :     aBlockEnd( nEndX, nEndY, nEndZ ),
     561                 :            :     pUndoDoc( pNewUndoDoc ),
     562                 :          0 :     pUndoTable( pNewUndoTab )
     563                 :            : {
     564                 :          0 : }
     565                 :            : 
     566                 :          0 : ScUndoAutoOutline::~ScUndoAutoOutline()
     567                 :            : {
     568 [ #  # ][ #  # ]:          0 :     delete pUndoDoc;
     569 [ #  # ][ #  # ]:          0 :     delete pUndoTable;
     570         [ #  # ]:          0 : }
     571                 :            : 
     572                 :          0 : rtl::OUString ScUndoAutoOutline::GetComment() const
     573                 :            : {   // "Auto-Gliederung"
     574                 :          0 :     return ScGlobal::GetRscString( STR_UNDO_AUTOOUTLINE );
     575                 :            : }
     576                 :            : 
     577                 :          0 : void ScUndoAutoOutline::Undo()
     578                 :            : {
     579                 :          0 :     BeginUndo();
     580                 :            : 
     581                 :          0 :     ScDocument* pDoc = pDocShell->GetDocument();
     582                 :          0 :     ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
     583                 :          0 :     SCTAB nTab = aBlockStart.Tab();
     584                 :            : 
     585                 :            :     //  Original Outline-Table
     586                 :            : 
     587                 :          0 :     pDoc->SetOutlineTable( nTab, pUndoTable );
     588                 :            : 
     589                 :            :     //  Original Spalten-/Zeilenstatus
     590                 :            : 
     591 [ #  # ][ #  # ]:          0 :     if (pUndoDoc && pUndoTable)
     592                 :            :     {
     593                 :            :         SCCOLROW nStartCol;
     594                 :            :         SCCOLROW nStartRow;
     595                 :            :         SCCOLROW nEndCol;
     596                 :            :         SCCOLROW nEndRow;
     597         [ #  # ]:          0 :         pUndoTable->GetColArray()->GetRange( nStartCol, nEndCol );
     598         [ #  # ]:          0 :         pUndoTable->GetRowArray()->GetRange( nStartRow, nEndRow );
     599                 :            : 
     600                 :            :         pUndoDoc->CopyToDocument( static_cast<SCCOL>(nStartCol), 0, nTab,
     601                 :            :                 static_cast<SCCOL>(nEndCol), MAXROW, nTab, IDF_NONE, false,
     602         [ #  # ]:          0 :                 pDoc);
     603         [ #  # ]:          0 :         pUndoDoc->CopyToDocument( 0, nStartRow, nTab, MAXCOL, nEndRow, nTab, IDF_NONE, false, pDoc );
     604                 :            : 
     605         [ #  # ]:          0 :         pViewShell->UpdateScrollBars();
     606                 :            :     }
     607                 :            : 
     608                 :          0 :     SCTAB nVisTab = pViewShell->GetViewData()->GetTabNo();
     609         [ #  # ]:          0 :     if ( nVisTab != nTab )
     610                 :          0 :         pViewShell->SetTabNo( nTab );
     611                 :            : 
     612                 :          0 :     pDocShell->PostPaint(0,0,nTab,MAXCOL,MAXROW,nTab,PAINT_GRID|PAINT_LEFT|PAINT_TOP|PAINT_SIZE);
     613                 :            : 
     614                 :          0 :     EndUndo();
     615                 :          0 : }
     616                 :            : 
     617                 :          0 : void ScUndoAutoOutline::Redo()
     618                 :            : {
     619         [ #  # ]:          0 :     BeginRedo();
     620                 :            : 
     621         [ #  # ]:          0 :     ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
     622                 :            : 
     623                 :          0 :     SCTAB nTab = aBlockStart.Tab();
     624         [ #  # ]:          0 :     if (pViewShell)
     625                 :            :     {
     626                 :            :         //  Tabelle muss vorher umgeschaltet sein (#46952#) !!!
     627                 :            : 
     628                 :          0 :         SCTAB nVisTab = pViewShell->GetViewData()->GetTabNo();
     629         [ #  # ]:          0 :         if ( nVisTab != nTab )
     630         [ #  # ]:          0 :             pViewShell->SetTabNo( nTab );
     631                 :            :     }
     632                 :            : 
     633                 :          0 :     ScRange aRange( aBlockStart.Col(), aBlockStart.Row(), nTab,
     634                 :          0 :                     aBlockEnd.Col(),   aBlockEnd.Row(),   nTab );
     635                 :          0 :     ScOutlineDocFunc aFunc( *pDocShell );
     636         [ #  # ]:          0 :     aFunc.AutoOutline( aRange, false, false );
     637                 :            : 
     638                 :            :     //  auf der View markieren
     639                 :            :     //  Wenn's beim Aufruf eine Mehrfachselektion war, ist es jetzt der
     640                 :            :     //  umschliessende Bereich...
     641                 :            : 
     642         [ #  # ]:          0 :     if (pViewShell)
     643         [ #  # ]:          0 :         pViewShell->MarkRange( aRange );
     644                 :            : 
     645         [ #  # ]:          0 :     EndRedo();
     646                 :          0 : }
     647                 :            : 
     648                 :          0 : void ScUndoAutoOutline::Repeat(SfxRepeatTarget& rTarget)
     649                 :            : {
     650         [ #  # ]:          0 :     if (rTarget.ISA(ScTabViewTarget))
     651                 :          0 :         ((ScTabViewTarget&)rTarget).GetViewShell()->AutoOutline( sal_True );
     652                 :          0 : }
     653                 :            : 
     654                 :          0 : sal_Bool ScUndoAutoOutline::CanRepeat(SfxRepeatTarget& rTarget) const
     655                 :            : {
     656                 :          0 :     return (rTarget.ISA(ScTabViewTarget));
     657                 :            : }
     658                 :            : 
     659                 :            : //
     660                 :            : //      Zwischenergebnisse
     661                 :            : //
     662                 :            : 
     663                 :          4 : ScUndoSubTotals::ScUndoSubTotals( ScDocShell* pNewDocShell, SCTAB nNewTab,
     664                 :            :                                 const ScSubTotalParam& rNewParam, SCROW nNewEndY,
     665                 :            :                                 ScDocument* pNewUndoDoc, ScOutlineTable* pNewUndoTab,
     666                 :            :                                 ScRangeName* pNewUndoRange, ScDBCollection* pNewUndoDB ) :
     667                 :            :     ScDBFuncUndo( pNewDocShell, ScRange( rNewParam.nCol1, rNewParam.nRow1, nNewTab,
     668                 :            :                                          rNewParam.nCol2, rNewParam.nRow2, nNewTab ) ),
     669                 :            :     nTab( nNewTab ),
     670                 :            :     aParam( rNewParam ),
     671                 :            :     nNewEndRow( nNewEndY ),
     672                 :            :     pUndoDoc( pNewUndoDoc ),
     673                 :            :     pUndoTable( pNewUndoTab ),
     674                 :            :     pUndoRange( pNewUndoRange ),
     675 [ +  - ][ +  - ]:          4 :     pUndoDB( pNewUndoDB )
     676                 :            : {
     677                 :          4 : }
     678                 :            : 
     679                 :          4 : ScUndoSubTotals::~ScUndoSubTotals()
     680                 :            : {
     681 [ +  - ][ +  - ]:          4 :     delete pUndoDoc;
     682 [ +  + ][ +  - ]:          4 :     delete pUndoTable;
     683 [ -  + ][ #  # ]:          4 :     delete pUndoRange;
     684 [ -  + ][ #  # ]:          4 :     delete pUndoDB;
     685         [ -  + ]:          8 : }
     686                 :            : 
     687                 :         12 : rtl::OUString ScUndoSubTotals::GetComment() const
     688                 :            : {   // "Teilergebnisse"
     689                 :         12 :     return ScGlobal::GetRscString( STR_UNDO_SUBTOTALS );
     690                 :            : }
     691                 :            : 
     692                 :          0 : void ScUndoSubTotals::Undo()
     693                 :            : {
     694                 :          0 :     BeginUndo();
     695                 :            : 
     696                 :          0 :     ScDocument* pDoc = pDocShell->GetDocument();
     697                 :          0 :     ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
     698                 :            : 
     699         [ #  # ]:          0 :     if (nNewEndRow > aParam.nRow2)
     700                 :            :     {
     701                 :          0 :         pDoc->DeleteRow( 0,nTab, MAXCOL,nTab, aParam.nRow2+1, static_cast<SCSIZE>(nNewEndRow-aParam.nRow2) );
     702                 :            :     }
     703         [ #  # ]:          0 :     else if (nNewEndRow < aParam.nRow2)
     704                 :            :     {
     705                 :          0 :         pDoc->InsertRow( 0,nTab, MAXCOL,nTab, nNewEndRow+1, static_cast<SCSIZE>(aParam.nRow2-nNewEndRow) );
     706                 :            :     }
     707                 :            : 
     708                 :            : 
     709                 :            :     //  Original Outline-Table
     710                 :            : 
     711                 :          0 :     pDoc->SetOutlineTable( nTab, pUndoTable );
     712                 :            : 
     713                 :            :     //  Original Spalten-/Zeilenstatus
     714                 :            : 
     715 [ #  # ][ #  # ]:          0 :     if (pUndoDoc && pUndoTable)
     716                 :            :     {
     717                 :            :         SCCOLROW nStartCol;
     718                 :            :         SCCOLROW nStartRow;
     719                 :            :         SCCOLROW nEndCol;
     720                 :            :         SCCOLROW nEndRow;
     721         [ #  # ]:          0 :         pUndoTable->GetColArray()->GetRange( nStartCol, nEndCol );
     722         [ #  # ]:          0 :         pUndoTable->GetRowArray()->GetRange( nStartRow, nEndRow );
     723                 :            : 
     724                 :            :         pUndoDoc->CopyToDocument( static_cast<SCCOL>(nStartCol), 0, nTab,
     725                 :            :                 static_cast<SCCOL>(nEndCol), MAXROW, nTab, IDF_NONE, false,
     726         [ #  # ]:          0 :                 pDoc);
     727         [ #  # ]:          0 :         pUndoDoc->CopyToDocument( 0, nStartRow, nTab, MAXCOL, nEndRow, nTab, IDF_NONE, false, pDoc );
     728                 :            : 
     729         [ #  # ]:          0 :         pViewShell->UpdateScrollBars();
     730                 :            :     }
     731                 :            : 
     732                 :            :     //  Original-Daten & Referenzen
     733                 :            : 
     734                 :            :     ScUndoUtil::MarkSimpleBlock( pDocShell, 0, aParam.nRow1+1, nTab,
     735                 :          0 :                                             MAXCOL, aParam.nRow2, nTab );
     736                 :            : 
     737                 :          0 :     pDoc->DeleteAreaTab( 0,aParam.nRow1+1, MAXCOL,aParam.nRow2, nTab, IDF_ALL );
     738                 :            : 
     739                 :            :     pUndoDoc->CopyToDocument( 0, aParam.nRow1+1, nTab, MAXCOL, aParam.nRow2, nTab,
     740                 :          0 :                                                             IDF_NONE, false, pDoc );    // Flags
     741                 :            :     pUndoDoc->UndoToDocument( 0, aParam.nRow1+1, nTab, MAXCOL, aParam.nRow2, nTab,
     742                 :          0 :                                                             IDF_ALL, false, pDoc );
     743                 :            : 
     744                 :            :     ScUndoUtil::MarkSimpleBlock( pDocShell, aParam.nCol1,aParam.nRow1,nTab,
     745                 :          0 :                                             aParam.nCol2,aParam.nRow2,nTab );
     746                 :            : 
     747         [ #  # ]:          0 :     if (pUndoRange)
     748         [ #  # ]:          0 :         pDoc->SetRangeName( new ScRangeName( *pUndoRange ) );
     749         [ #  # ]:          0 :     if (pUndoDB)
     750         [ #  # ]:          0 :         pDoc->SetDBCollection( new ScDBCollection( *pUndoDB ), sal_True );
     751                 :            : 
     752                 :          0 :     SCTAB nVisTab = pViewShell->GetViewData()->GetTabNo();
     753         [ #  # ]:          0 :     if ( nVisTab != nTab )
     754                 :          0 :         pViewShell->SetTabNo( nTab );
     755                 :            : 
     756                 :          0 :     pDocShell->PostPaint(0,0,nTab,MAXCOL,MAXROW,nTab,PAINT_GRID|PAINT_LEFT|PAINT_TOP|PAINT_SIZE);
     757                 :          0 :     pDocShell->PostDataChanged();
     758                 :            : 
     759                 :          0 :     EndUndo();
     760                 :          0 : }
     761                 :            : 
     762                 :          0 : void ScUndoSubTotals::Redo()
     763                 :            : {
     764                 :          0 :     BeginRedo();
     765                 :            : 
     766                 :          0 :     ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
     767                 :            : 
     768                 :          0 :     SCTAB nVisTab = pViewShell->GetViewData()->GetTabNo();
     769         [ #  # ]:          0 :     if ( nVisTab != nTab )
     770                 :          0 :         pViewShell->SetTabNo( nTab );
     771                 :            : 
     772                 :            :     ScUndoUtil::MarkSimpleBlock( pDocShell, aParam.nCol1,aParam.nRow1,nTab,
     773                 :          0 :                                             aParam.nCol2,aParam.nRow2,nTab );
     774                 :          0 :     pViewShell->DoSubTotals( aParam, false );
     775                 :            : 
     776                 :          0 :     EndRedo();
     777                 :          0 : }
     778                 :            : 
     779                 :          0 : void ScUndoSubTotals::Repeat(SfxRepeatTarget& /* rTarget */)
     780                 :            : {
     781                 :          0 : }
     782                 :            : 
     783                 :          8 : sal_Bool ScUndoSubTotals::CanRepeat(SfxRepeatTarget& /* rTarget */) const
     784                 :            : {
     785                 :          8 :     return false;                       // geht nicht wegen Spaltennummern
     786                 :            : }
     787                 :            : 
     788                 :            : //
     789                 :            : //      Sortieren
     790                 :            : //
     791                 :            : 
     792                 :          8 : ScUndoSort::ScUndoSort( ScDocShell* pNewDocShell,
     793                 :            :                         SCTAB nNewTab, const ScSortParam& rParam,
     794                 :            :                         sal_Bool bQuery, ScDocument* pNewUndoDoc, ScDBCollection* pNewUndoDB,
     795                 :            :                         const ScRange* pDest ) :
     796                 :            :     ScDBFuncUndo( pNewDocShell, ScRange( rParam.nCol1, rParam.nRow1, nNewTab,
     797                 :            :                                          rParam.nCol2, rParam.nRow2, nNewTab ) ),
     798                 :            :     nTab( nNewTab ),
     799                 :            :     aSortParam( rParam ),
     800                 :            :     bRepeatQuery( bQuery ),
     801                 :            :     pUndoDoc( pNewUndoDoc ),
     802                 :            :     pUndoDB( pNewUndoDB ),
     803 [ +  - ][ +  - ]:          8 :     bDestArea( false )
     804                 :            : {
     805         [ -  + ]:          8 :     if ( pDest )
     806                 :            :     {
     807                 :          0 :         bDestArea = sal_True;
     808                 :          0 :         aDestRange = *pDest;
     809                 :            :     }
     810                 :          8 : }
     811                 :            : 
     812         [ +  - ]:          8 : ScUndoSort::~ScUndoSort()
     813                 :            : {
     814 [ +  - ][ +  - ]:          8 :     delete pUndoDoc;
     815 [ -  + ][ #  # ]:          8 :     delete pUndoDB;
     816         [ -  + ]:         16 : }
     817                 :            : 
     818                 :          8 : rtl::OUString ScUndoSort::GetComment() const
     819                 :            : {
     820                 :          8 :     return ScGlobal::GetRscString( STR_UNDO_SORT );
     821                 :            : }
     822                 :            : 
     823                 :          0 : void ScUndoSort::Undo()
     824                 :            : {
     825                 :          0 :     BeginUndo();
     826                 :            : 
     827                 :          0 :     ScDocument* pDoc = pDocShell->GetDocument();
     828                 :          0 :     ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
     829                 :            : 
     830                 :          0 :     SCCOL nStartCol = aSortParam.nCol1;
     831                 :          0 :     SCROW nStartRow = aSortParam.nRow1;
     832                 :          0 :     SCCOL nEndCol    = aSortParam.nCol2;
     833                 :          0 :     SCROW nEndRow    = aSortParam.nRow2;
     834                 :          0 :     SCTAB nSortTab  = nTab;
     835         [ #  # ]:          0 :     if ( !aSortParam.bInplace )
     836                 :            :     {
     837                 :          0 :         nStartCol = aSortParam.nDestCol;
     838                 :          0 :         nStartRow = aSortParam.nDestRow;
     839                 :          0 :         nEndCol   = nStartCol + ( aSortParam.nCol2 - aSortParam.nCol1 );
     840                 :          0 :         nEndRow   = nStartRow + ( aSortParam.nRow2 - aSortParam.nRow1 );
     841                 :          0 :         nSortTab  = aSortParam.nDestTab;
     842                 :            :     }
     843                 :            : 
     844                 :            :     ScUndoUtil::MarkSimpleBlock( pDocShell, nStartCol, nStartRow, nSortTab,
     845                 :          0 :                                  nEndCol, nEndRow, nSortTab );
     846                 :            : 
     847                 :            :     // do not delete/copy note captions, they are handled in drawing undo (ScDBFuncUndo::mpDrawUndo)
     848                 :          0 :     pDoc->DeleteAreaTab( nStartCol,nStartRow, nEndCol,nEndRow, nSortTab, IDF_ALL|IDF_NOCAPTIONS );
     849                 :            :     pUndoDoc->CopyToDocument( nStartCol, nStartRow, nSortTab, nEndCol, nEndRow, nSortTab,
     850                 :          0 :                                 IDF_ALL|IDF_NOCAPTIONS, false, pDoc );
     851                 :            : 
     852         [ #  # ]:          0 :     if (bDestArea)
     853                 :            :     {
     854                 :            :         // do not delete/copy note captions, they are handled in drawing undo (ScDBFuncUndo::mpDrawUndo)
     855                 :          0 :         pDoc->DeleteAreaTab( aDestRange, IDF_ALL|IDF_NOCAPTIONS );
     856                 :          0 :         pUndoDoc->CopyToDocument( aDestRange, IDF_ALL|IDF_NOCAPTIONS, false, pDoc );
     857                 :            :     }
     858                 :            : 
     859                 :            :     //  Zeilenhoehen immer (wegen automatischer Anpassung)
     860                 :            :     //! auf ScBlockUndo umstellen
     861                 :            : //  if (bRepeatQuery)
     862                 :            :         pUndoDoc->CopyToDocument( 0, nStartRow, nSortTab, MAXCOL, nEndRow, nSortTab,
     863                 :          0 :                                 IDF_NONE, false, pDoc );
     864                 :            : 
     865         [ #  # ]:          0 :     if (pUndoDB)
     866         [ #  # ]:          0 :         pDoc->SetDBCollection( new ScDBCollection( *pUndoDB ), sal_True );
     867                 :            : 
     868                 :          0 :     SCTAB nVisTab = pViewShell->GetViewData()->GetTabNo();
     869         [ #  # ]:          0 :     if ( nVisTab != nSortTab )
     870                 :          0 :         pViewShell->SetTabNo( nSortTab );
     871                 :            : 
     872                 :          0 :     pDocShell->PostPaint(0,0,nTab,MAXCOL,MAXROW,nTab,PAINT_GRID|PAINT_LEFT|PAINT_TOP|PAINT_SIZE);
     873                 :          0 :     pDocShell->PostDataChanged();
     874                 :            : 
     875                 :          0 :     EndUndo();
     876                 :          0 : }
     877                 :            : 
     878                 :          0 : void ScUndoSort::Redo()
     879                 :            : {
     880                 :          0 :     BeginRedo();
     881                 :            : 
     882                 :          0 :     ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
     883                 :            : 
     884                 :          0 :     SCTAB nVisTab = pViewShell->GetViewData()->GetTabNo();
     885         [ #  # ]:          0 :     if ( nVisTab != nTab )
     886                 :          0 :         pViewShell->SetTabNo( nTab );
     887                 :            : 
     888                 :            :     pViewShell->MarkRange( ScRange( aSortParam.nCol1, aSortParam.nRow1, nTab,
     889         [ #  # ]:          0 :                                       aSortParam.nCol2, aSortParam.nRow2, nTab ) );
     890                 :            : 
     891                 :          0 :     pViewShell->Sort( aSortParam, false );
     892                 :            : 
     893                 :            :     //  Quellbereich painten wegen Markierung
     894         [ #  # ]:          0 :     if ( !aSortParam.bInplace )
     895                 :            :         pDocShell->PostPaint( aSortParam.nCol1, aSortParam.nRow1, nTab,
     896                 :          0 :                               aSortParam.nCol2, aSortParam.nRow2, nTab, PAINT_GRID );
     897                 :            : 
     898                 :          0 :     EndRedo();
     899                 :          0 : }
     900                 :            : 
     901                 :          0 : void ScUndoSort::Repeat(SfxRepeatTarget& /* rTarget */)
     902                 :            : {
     903                 :          0 : }
     904                 :            : 
     905                 :          0 : sal_Bool ScUndoSort::CanRepeat(SfxRepeatTarget& /* rTarget */) const
     906                 :            : {
     907                 :          0 :     return false;                       // geht nicht wegen Spaltennummern
     908                 :            : }
     909                 :            : 
     910                 :            : //
     911                 :            : //      Filtern
     912                 :            : //
     913                 :            : 
     914                 :          2 : ScUndoQuery::ScUndoQuery( ScDocShell* pNewDocShell, SCTAB nNewTab, const ScQueryParam& rParam,
     915                 :            :                             ScDocument* pNewUndoDoc, ScDBCollection* pNewUndoDB,
     916                 :            :                             const ScRange* pOld, sal_Bool bSize, const ScRange* pAdvSrc ) :
     917                 :            :     ScDBFuncUndo( pNewDocShell, ScRange( rParam.nCol1, rParam.nRow1, nNewTab,
     918                 :            :                                          rParam.nCol2, rParam.nRow2, nNewTab ) ),
     919                 :            :     pDrawUndo( NULL ),
     920                 :            :     nTab( nNewTab ),
     921                 :            :     aQueryParam( rParam ),
     922                 :            :     pUndoDoc( pNewUndoDoc ),
     923                 :            :     pUndoDB( pNewUndoDB ),
     924                 :            :     bIsAdvanced( false ),
     925                 :            :     bDestArea( false ),
     926 [ +  - ][ +  - ]:          2 :     bDoSize( bSize )
     927                 :            : {
     928         [ -  + ]:          2 :     if ( pOld )
     929                 :            :     {
     930                 :          0 :         bDestArea = sal_True;
     931                 :          0 :         aOldDest = *pOld;
     932                 :            :     }
     933         [ -  + ]:          2 :     if ( pAdvSrc )
     934                 :            :     {
     935                 :          0 :         bIsAdvanced = sal_True;
     936                 :          0 :         aAdvSource = *pAdvSrc;
     937                 :            :     }
     938                 :            : 
     939         [ +  - ]:          2 :     pDrawUndo = GetSdrUndoAction( pDocShell->GetDocument() );
     940                 :          2 : }
     941                 :            : 
     942         [ +  - ]:          2 : ScUndoQuery::~ScUndoQuery()
     943                 :            : {
     944 [ +  - ][ +  - ]:          2 :     delete pUndoDoc;
     945 [ -  + ][ #  # ]:          2 :     delete pUndoDB;
     946         [ +  - ]:          2 :     DeleteSdrUndoAction( pDrawUndo );
     947         [ -  + ]:          4 : }
     948                 :            : 
     949                 :          2 : rtl::OUString ScUndoQuery::GetComment() const
     950                 :            : {   // "Filtern";
     951                 :          2 :     return ScGlobal::GetRscString( STR_UNDO_QUERY );
     952                 :            : }
     953                 :            : 
     954                 :          0 : void ScUndoQuery::Undo()
     955                 :            : {
     956         [ #  # ]:          0 :     BeginUndo();
     957                 :            : 
     958                 :          0 :     ScDocument* pDoc = pDocShell->GetDocument();
     959         [ #  # ]:          0 :     ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
     960                 :            : 
     961                 :          0 :     sal_Bool bCopy = !aQueryParam.bInplace;
     962                 :          0 :     SCCOL nDestEndCol = 0;
     963                 :          0 :     SCROW nDestEndRow = 0;
     964         [ #  # ]:          0 :     if (bCopy)
     965                 :            :     {
     966                 :          0 :         nDestEndCol = aQueryParam.nDestCol + ( aQueryParam.nCol2-aQueryParam.nCol1 );
     967                 :          0 :         nDestEndRow = aQueryParam.nDestRow + ( aQueryParam.nRow2-aQueryParam.nRow1 );
     968                 :            : 
     969                 :            :         ScDBData* pData = pDoc->GetDBAtCursor( aQueryParam.nDestCol, aQueryParam.nDestRow,
     970         [ #  # ]:          0 :                                                 aQueryParam.nDestTab, sal_True );
     971         [ #  # ]:          0 :         if (pData)
     972                 :            :         {
     973                 :          0 :             ScRange aNewDest;
     974         [ #  # ]:          0 :             pData->GetArea( aNewDest );
     975                 :          0 :             nDestEndCol = aNewDest.aEnd.Col();
     976                 :          0 :             nDestEndRow = aNewDest.aEnd.Row();
     977                 :            :         }
     978                 :            : 
     979 [ #  # ][ #  # ]:          0 :         if ( bDoSize && bDestArea )
     980                 :            :         {
     981                 :            :             //  aDestRange ist der alte Bereich
     982                 :            :             pDoc->FitBlock( ScRange(
     983                 :            :                                 aQueryParam.nDestCol, aQueryParam.nDestRow, aQueryParam.nDestTab,
     984                 :            :                                 nDestEndCol, nDestEndRow, aQueryParam.nDestTab ),
     985         [ #  # ]:          0 :                             aOldDest );
     986                 :            :         }
     987                 :            : 
     988                 :            :         ScUndoUtil::MarkSimpleBlock( pDocShell,
     989                 :            :                                     aQueryParam.nDestCol, aQueryParam.nDestRow, aQueryParam.nDestTab,
     990         [ #  # ]:          0 :                                     nDestEndCol, nDestEndRow, aQueryParam.nDestTab );
     991                 :            :         pDoc->DeleteAreaTab( aQueryParam.nDestCol, aQueryParam.nDestRow,
     992         [ #  # ]:          0 :                             nDestEndCol, nDestEndRow, aQueryParam.nDestTab, IDF_ALL );
     993                 :            : 
     994         [ #  # ]:          0 :         pViewShell->DoneBlockMode();
     995                 :            : 
     996                 :            :         pUndoDoc->CopyToDocument( aQueryParam.nDestCol, aQueryParam.nDestRow, aQueryParam.nDestTab,
     997                 :            :                                     nDestEndCol, nDestEndRow, aQueryParam.nDestTab,
     998         [ #  # ]:          0 :                                     IDF_ALL, false, pDoc );
     999                 :            :         //  Attribute werden immer mitkopiert (#49287#)
    1000                 :            : 
    1001                 :            :         //  Rest von altem Bereich
    1002 [ #  # ][ #  # ]:          0 :         if ( bDestArea && !bDoSize )
    1003                 :            :         {
    1004         [ #  # ]:          0 :             pDoc->DeleteAreaTab( aOldDest, IDF_ALL );
    1005         [ #  # ]:          0 :             pUndoDoc->CopyToDocument( aOldDest, IDF_ALL, false, pDoc );
    1006                 :            :         }
    1007                 :            :     }
    1008                 :            :     else
    1009                 :            :         pUndoDoc->CopyToDocument( 0, aQueryParam.nRow1, nTab, MAXCOL, aQueryParam.nRow2, nTab,
    1010         [ #  # ]:          0 :                                         IDF_NONE, false, pDoc );
    1011                 :            : 
    1012         [ #  # ]:          0 :     if (pUndoDB)
    1013 [ #  # ][ #  # ]:          0 :         pDoc->SetDBCollection( new ScDBCollection( *pUndoDB ), sal_True );
                 [ #  # ]
    1014                 :            : 
    1015         [ #  # ]:          0 :     if (!bCopy)
    1016                 :            :     {
    1017         [ #  # ]:          0 :         pDoc->InvalidatePageBreaks(nTab);
    1018         [ #  # ]:          0 :         pDoc->UpdatePageBreaks( nTab );
    1019                 :            :     }
    1020                 :            : 
    1021                 :            :     ScRange aDirtyRange( 0 , aQueryParam.nRow1, nTab,
    1022                 :          0 :         MAXCOL, aQueryParam.nRow2, nTab );
    1023         [ #  # ]:          0 :     pDoc->SetDirty( aDirtyRange );
    1024                 :            : 
    1025         [ #  # ]:          0 :     DoSdrUndoAction( pDrawUndo, pDoc );
    1026                 :            : 
    1027                 :          0 :     SCTAB nVisTab = pViewShell->GetViewData()->GetTabNo();
    1028         [ #  # ]:          0 :     if ( nVisTab != nTab )
    1029         [ #  # ]:          0 :         pViewShell->SetTabNo( nTab );
    1030                 :            : 
    1031                 :            :         //  Paint
    1032                 :            : 
    1033         [ #  # ]:          0 :     if (bCopy)
    1034                 :            :     {
    1035                 :          0 :         SCCOL nEndX = nDestEndCol;
    1036                 :          0 :         SCROW nEndY = nDestEndRow;
    1037         [ #  # ]:          0 :         if (bDestArea)
    1038                 :            :         {
    1039         [ #  # ]:          0 :             if ( aOldDest.aEnd.Col() > nEndX )
    1040                 :          0 :                 nEndX = aOldDest.aEnd.Col();
    1041         [ #  # ]:          0 :             if ( aOldDest.aEnd.Row() > nEndY )
    1042                 :          0 :                 nEndY = aOldDest.aEnd.Row();
    1043                 :            :         }
    1044         [ #  # ]:          0 :         if (bDoSize)
    1045                 :          0 :             nEndY = MAXROW;
    1046                 :            :         pDocShell->PostPaint( aQueryParam.nDestCol, aQueryParam.nDestRow, aQueryParam.nDestTab,
    1047         [ #  # ]:          0 :                                     nEndX, nEndY, aQueryParam.nDestTab, PAINT_GRID );
    1048                 :            :     }
    1049                 :            :     else
    1050                 :            :         pDocShell->PostPaint( 0, aQueryParam.nRow1, nTab, MAXCOL, MAXROW, nTab,
    1051         [ #  # ]:          0 :                                                     PAINT_GRID | PAINT_LEFT );
    1052         [ #  # ]:          0 :     pDocShell->PostDataChanged();
    1053                 :            : 
    1054         [ #  # ]:          0 :     EndUndo();
    1055                 :          0 : }
    1056                 :            : 
    1057                 :          0 : void ScUndoQuery::Redo()
    1058                 :            : {
    1059                 :          0 :     BeginRedo();
    1060                 :            : 
    1061                 :          0 :     ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
    1062                 :            : 
    1063                 :          0 :     SCTAB nVisTab = pViewShell->GetViewData()->GetTabNo();
    1064         [ #  # ]:          0 :     if ( nVisTab != nTab )
    1065                 :          0 :         pViewShell->SetTabNo( nTab );
    1066                 :            : 
    1067         [ #  # ]:          0 :     if ( bIsAdvanced )
    1068                 :          0 :         pViewShell->Query( aQueryParam, &aAdvSource, false );
    1069                 :            :     else
    1070                 :          0 :         pViewShell->Query( aQueryParam, NULL, false );
    1071                 :            : 
    1072                 :          0 :     EndRedo();
    1073                 :          0 : }
    1074                 :            : 
    1075                 :          0 : void ScUndoQuery::Repeat(SfxRepeatTarget& /* rTarget */)
    1076                 :            : {
    1077                 :          0 : }
    1078                 :            : 
    1079                 :          0 : sal_Bool ScUndoQuery::CanRepeat(SfxRepeatTarget& /* rTarget */) const
    1080                 :            : {
    1081                 :          0 :     return false;                       // geht nicht wegen Spaltennummern
    1082                 :            : }
    1083                 :            : 
    1084                 :            : //
    1085                 :            : //      Show or hide AutoFilter buttons (doesn't include filter settings)
    1086                 :            : //
    1087                 :            : 
    1088                 :          0 : ScUndoAutoFilter::ScUndoAutoFilter( ScDocShell* pNewDocShell, const ScRange& rRange,
    1089                 :            :                                     const ::rtl::OUString& rName, bool bSet ) :
    1090                 :            :     ScDBFuncUndo( pNewDocShell, rRange ),
    1091                 :            :     aDBName( rName ),
    1092                 :          0 :     bFilterSet( bSet )
    1093                 :            : {
    1094                 :          0 : }
    1095                 :            : 
    1096                 :          0 : ScUndoAutoFilter::~ScUndoAutoFilter()
    1097                 :            : {
    1098         [ #  # ]:          0 : }
    1099                 :            : 
    1100                 :          0 : rtl::OUString ScUndoAutoFilter::GetComment() const
    1101                 :            : {
    1102                 :          0 :     return ScGlobal::GetRscString( STR_UNDO_QUERY );    // same as ScUndoQuery
    1103                 :            : }
    1104                 :            : 
    1105                 :          0 : void ScUndoAutoFilter::DoChange( bool bUndo )
    1106                 :            : {
    1107         [ #  # ]:          0 :     bool bNewFilter = bUndo ? !bFilterSet : bFilterSet;
    1108                 :            : 
    1109                 :          0 :     ScDocument* pDoc = pDocShell->GetDocument();
    1110                 :          0 :     ScDBData* pDBData=NULL;
    1111         [ #  # ]:          0 :     if (aDBName.equalsAscii(STR_DB_LOCAL_NONAME))
    1112                 :            :     {
    1113                 :          0 :         SCTAB nTab = aOriginalRange.aStart.Tab();
    1114                 :          0 :         pDBData = pDoc->GetAnonymousDBData(nTab);
    1115                 :            :     }
    1116                 :            :     else
    1117                 :            :     {
    1118                 :          0 :         ScDBCollection* pColl = pDoc->GetDBCollection();
    1119                 :          0 :         pDBData = pColl->getNamedDBs().findByName(aDBName);
    1120                 :            :     }
    1121                 :            : 
    1122         [ #  # ]:          0 :     if ( pDBData )
    1123                 :            :     {
    1124                 :          0 :         pDBData->SetAutoFilter( bNewFilter );
    1125                 :            : 
    1126                 :            :         SCCOL nRangeX1;
    1127                 :            :         SCROW nRangeY1;
    1128                 :            :         SCCOL nRangeX2;
    1129                 :            :         SCROW nRangeY2;
    1130                 :            :         SCTAB nRangeTab;
    1131         [ #  # ]:          0 :         pDBData->GetArea( nRangeTab, nRangeX1, nRangeY1, nRangeX2, nRangeY2 );
    1132                 :            : 
    1133         [ #  # ]:          0 :         if ( bNewFilter )
    1134         [ #  # ]:          0 :             pDoc->ApplyFlagsTab( nRangeX1, nRangeY1, nRangeX2, nRangeY1, nRangeTab, SC_MF_AUTO );
    1135                 :            :         else
    1136         [ #  # ]:          0 :             pDoc->RemoveFlagsTab( nRangeX1, nRangeY1, nRangeX2, nRangeY1, nRangeTab, SC_MF_AUTO );
    1137                 :            : 
    1138         [ #  # ]:          0 :         pDocShell->PostPaint( nRangeX1, nRangeY1, nRangeTab, nRangeX2, nRangeY1, nRangeTab, PAINT_GRID );
    1139                 :            :     }
    1140                 :          0 : }
    1141                 :            : 
    1142                 :          0 : void ScUndoAutoFilter::Undo()
    1143                 :            : {
    1144                 :          0 :     BeginUndo();
    1145                 :          0 :     DoChange( sal_True );
    1146                 :          0 :     EndUndo();
    1147                 :          0 : }
    1148                 :            : 
    1149                 :          0 : void ScUndoAutoFilter::Redo()
    1150                 :            : {
    1151                 :          0 :     BeginRedo();
    1152                 :          0 :     DoChange( false );
    1153                 :          0 :     EndRedo();
    1154                 :          0 : }
    1155                 :            : 
    1156                 :          0 : void ScUndoAutoFilter::Repeat(SfxRepeatTarget& /* rTarget */)
    1157                 :            : {
    1158                 :          0 : }
    1159                 :            : 
    1160                 :          0 : sal_Bool ScUndoAutoFilter::CanRepeat(SfxRepeatTarget& /* rTarget */) const
    1161                 :            : {
    1162                 :          0 :     return false;
    1163                 :            : }
    1164                 :            : 
    1165                 :            : //
    1166                 :            : //      Datenbankbereiche aendern (Dialog)
    1167                 :            : //
    1168                 :            : 
    1169                 :         29 : ScUndoDBData::ScUndoDBData( ScDocShell* pNewDocShell,
    1170                 :            :                             ScDBCollection* pNewUndoColl, ScDBCollection* pNewRedoColl ) :
    1171                 :            :     ScSimpleUndo( pNewDocShell ),
    1172                 :            :     pUndoColl( pNewUndoColl ),
    1173                 :         29 :     pRedoColl( pNewRedoColl )
    1174                 :            : {
    1175                 :         29 : }
    1176                 :            : 
    1177                 :         29 : ScUndoDBData::~ScUndoDBData()
    1178                 :            : {
    1179 [ +  - ][ +  - ]:         29 :     delete pUndoColl;
    1180 [ +  - ][ +  - ]:         29 :     delete pRedoColl;
    1181         [ -  + ]:         58 : }
    1182                 :            : 
    1183                 :         33 : rtl::OUString ScUndoDBData::GetComment() const
    1184                 :            : {   // "Datenbankbereiche aendern";
    1185                 :         33 :     return ScGlobal::GetRscString( STR_UNDO_DBDATA );
    1186                 :            : }
    1187                 :            : 
    1188                 :          0 : void ScUndoDBData::Undo()
    1189                 :            : {
    1190                 :          0 :     BeginUndo();
    1191                 :            : 
    1192                 :          0 :     ScDocument* pDoc = pDocShell->GetDocument();
    1193                 :            : 
    1194                 :          0 :     sal_Bool bOldAutoCalc = pDoc->GetAutoCalc();
    1195                 :          0 :     pDoc->SetAutoCalc( false );         // unnoetige Berechnungen vermeiden
    1196                 :          0 :     pDoc->CompileDBFormula( sal_True );     // CreateFormulaString
    1197         [ #  # ]:          0 :     pDoc->SetDBCollection( new ScDBCollection(*pUndoColl), sal_True );
    1198                 :          0 :     pDoc->CompileDBFormula( false );    // CompileFormulaString
    1199                 :          0 :     pDoc->SetAutoCalc( bOldAutoCalc );
    1200                 :            : 
    1201 [ #  # ][ #  # ]:          0 :     SFX_APP()->Broadcast( SfxSimpleHint( SC_HINT_DBAREAS_CHANGED ) );
    1202                 :            : 
    1203                 :          0 :     EndUndo();
    1204                 :          0 : }
    1205                 :            : 
    1206                 :          0 : void ScUndoDBData::Redo()
    1207                 :            : {
    1208                 :          0 :     BeginRedo();
    1209                 :            : 
    1210                 :          0 :     ScDocument* pDoc = pDocShell->GetDocument();
    1211                 :            : 
    1212                 :          0 :     sal_Bool bOldAutoCalc = pDoc->GetAutoCalc();
    1213                 :          0 :     pDoc->SetAutoCalc( false );         // unnoetige Berechnungen vermeiden
    1214                 :          0 :     pDoc->CompileDBFormula( sal_True );     // CreateFormulaString
    1215         [ #  # ]:          0 :     pDoc->SetDBCollection( new ScDBCollection(*pRedoColl), sal_True );
    1216                 :          0 :     pDoc->CompileDBFormula( false );    // CompileFormulaString
    1217                 :          0 :     pDoc->SetAutoCalc( bOldAutoCalc );
    1218                 :            : 
    1219 [ #  # ][ #  # ]:          0 :     SFX_APP()->Broadcast( SfxSimpleHint( SC_HINT_DBAREAS_CHANGED ) );
    1220                 :            : 
    1221                 :          0 :     EndRedo();
    1222                 :          0 : }
    1223                 :            : 
    1224                 :          0 : void ScUndoDBData::Repeat(SfxRepeatTarget& /* rTarget */)
    1225                 :            : {
    1226                 :          0 : }
    1227                 :            : 
    1228                 :          4 : sal_Bool ScUndoDBData::CanRepeat(SfxRepeatTarget& /* rTarget */) const
    1229                 :            : {
    1230                 :          4 :     return false;                       // geht nicht
    1231                 :            : }
    1232                 :            : 
    1233                 :            : //
    1234                 :            : //      Import
    1235                 :            : //
    1236                 :            : 
    1237                 :          6 : ScUndoImportData::ScUndoImportData( ScDocShell* pNewDocShell, SCTAB nNewTab,
    1238                 :            :                                 const ScImportParam& rParam, SCCOL nNewEndX, SCROW nNewEndY,
    1239                 :            :                                 SCCOL nNewFormula,
    1240                 :            :                                 ScDocument* pNewUndoDoc, ScDocument* pNewRedoDoc,
    1241                 :            :                                 ScDBData* pNewUndoData, ScDBData* pNewRedoData ) :
    1242                 :            :     ScSimpleUndo( pNewDocShell ),
    1243                 :            :     nTab( nNewTab ),
    1244                 :            :     aImportParam( rParam ),
    1245                 :            :     nEndCol( nNewEndX ),
    1246                 :            :     nEndRow( nNewEndY ),
    1247                 :            :     pUndoDoc( pNewUndoDoc ),
    1248                 :            :     pRedoDoc( pNewRedoDoc ),
    1249                 :            :     pUndoDBData( pNewUndoData ),
    1250                 :            :     pRedoDBData( pNewRedoData ),
    1251                 :            :     nFormulaCols( nNewFormula ),
    1252         [ +  - ]:          6 :     bRedoFilled( false )
    1253                 :            : {
    1254                 :            :     // redo doc doesn't contain imported data (but everything else)
    1255                 :          6 : }
    1256                 :            : 
    1257         [ +  - ]:          6 : ScUndoImportData::~ScUndoImportData()
    1258                 :            : {
    1259 [ +  - ][ +  - ]:          6 :     delete pUndoDoc;
    1260 [ +  - ][ +  - ]:          6 :     delete pRedoDoc;
    1261 [ +  - ][ +  - ]:          6 :     delete pUndoDBData;
    1262 [ +  - ][ +  - ]:          6 :     delete pRedoDBData;
    1263         [ -  + ]:         12 : }
    1264                 :            : 
    1265                 :         10 : rtl::OUString ScUndoImportData::GetComment() const
    1266                 :            : {   // "Importieren";
    1267                 :         10 :     return ScGlobal::GetRscString( STR_UNDO_IMPORTDATA );
    1268                 :            : }
    1269                 :            : 
    1270                 :          0 : void ScUndoImportData::Undo()
    1271                 :            : {
    1272         [ #  # ]:          0 :     BeginUndo();
    1273                 :            : 
    1274                 :          0 :     ScDocument* pDoc = pDocShell->GetDocument();
    1275         [ #  # ]:          0 :     ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
    1276                 :            : 
    1277                 :            :     ScUndoUtil::MarkSimpleBlock( pDocShell, aImportParam.nCol1,aImportParam.nRow1,nTab,
    1278         [ #  # ]:          0 :                                                         nEndCol,nEndRow,nTab );
    1279                 :            : 
    1280                 :            :     SCTAB nTable;
    1281                 :            :     SCCOL nCol1, nCol2;
    1282                 :            :     SCROW nRow1, nRow2;
    1283                 :          0 :     ScDBData* pCurrentData = NULL;
    1284 [ #  # ][ #  # ]:          0 :     if (pUndoDBData && pRedoDBData)
    1285                 :            :     {
    1286         [ #  # ]:          0 :         pRedoDBData->GetArea( nTable, nCol1, nRow1, nCol2, nRow2 );
    1287                 :            :         pCurrentData = ScUndoUtil::GetOldDBData( pRedoDBData, pDoc, nTab,
    1288         [ #  # ]:          0 :                                                     nCol1, nRow1, nCol2, nRow2 );
    1289                 :            : 
    1290         [ #  # ]:          0 :         if ( !bRedoFilled )
    1291                 :            :         {
    1292                 :            :             //  read redo data from document at first undo
    1293                 :            :             //  imported data is deleted later anyway,
    1294                 :            :             //  so now delete each column after copying to save memory (#41216#)
    1295                 :            : 
    1296                 :          0 :             sal_Bool bOldAutoCalc = pDoc->GetAutoCalc();
    1297         [ #  # ]:          0 :             pDoc->SetAutoCalc( false );             // outside of the loop
    1298         [ #  # ]:          0 :             for (SCCOL nCopyCol = nCol1; nCopyCol <= nCol2; nCopyCol++)
    1299                 :            :             {
    1300                 :            :                 pDoc->CopyToDocument( nCopyCol,nRow1,nTab, nCopyCol,nRow2,nTab,
    1301         [ #  # ]:          0 :                                         IDF_CONTENTS & ~IDF_NOTE, false, pRedoDoc );
    1302         [ #  # ]:          0 :                 pDoc->DeleteAreaTab( nCopyCol,nRow1, nCopyCol,nRow2, nTab, IDF_CONTENTS & ~IDF_NOTE );
    1303         [ #  # ]:          0 :                 pDoc->DoColResize( nTab, nCopyCol, nCopyCol, 0 );
    1304                 :            :             }
    1305         [ #  # ]:          0 :             pDoc->SetAutoCalc( bOldAutoCalc );
    1306                 :          0 :             bRedoFilled = sal_True;
    1307                 :            :         }
    1308                 :            :     }
    1309                 :            :     sal_Bool bMoveCells = pUndoDBData && pRedoDBData &&
    1310 [ #  # ][ #  # ]:          0 :                         pRedoDBData->IsDoSize();        // in alt und neu gleich
                 [ #  # ]
    1311         [ #  # ]:          0 :     if (bMoveCells)
    1312                 :            :     {
    1313                 :            :         //  Undo: erst die neuen Daten loeschen, dann FitBlock rueckwaerts
    1314                 :            : 
    1315                 :          0 :         ScRange aOld, aNew;
    1316         [ #  # ]:          0 :         pUndoDBData->GetArea( aOld );
    1317         [ #  # ]:          0 :         pRedoDBData->GetArea( aNew );
    1318                 :            : 
    1319                 :          0 :         pDoc->DeleteAreaTab( aNew.aStart.Col(), aNew.aStart.Row(),
    1320         [ #  # ]:          0 :                                 aNew.aEnd.Col(), aNew.aEnd.Row(), nTab, IDF_ALL & ~IDF_NOTE );
    1321                 :            : 
    1322                 :          0 :         aOld.aEnd.SetCol( aOld.aEnd.Col() + nFormulaCols );     // FitBlock auch fuer Formeln
    1323                 :          0 :         aNew.aEnd.SetCol( aNew.aEnd.Col() + nFormulaCols );
    1324         [ #  # ]:          0 :         pDoc->FitBlock( aNew, aOld, false );                    // rueckwaerts
    1325                 :            :     }
    1326                 :            :     else
    1327                 :            :         pDoc->DeleteAreaTab( aImportParam.nCol1,aImportParam.nRow1,
    1328         [ #  # ]:          0 :                                 nEndCol,nEndRow, nTab, IDF_ALL & ~IDF_NOTE );
    1329                 :            : 
    1330                 :            :     pUndoDoc->CopyToDocument( aImportParam.nCol1,aImportParam.nRow1,nTab,
    1331                 :            :                                 nEndCol+nFormulaCols,nEndRow,nTab,
    1332         [ #  # ]:          0 :                                 IDF_ALL & ~IDF_NOTE, false, pDoc );
    1333                 :            : 
    1334         [ #  # ]:          0 :     if (pCurrentData)
    1335                 :            :     {
    1336         [ #  # ]:          0 :         *pCurrentData = *pUndoDBData;
    1337                 :            : 
    1338         [ #  # ]:          0 :         pUndoDBData->GetArea( nTable, nCol1, nRow1, nCol2, nRow2 );
    1339         [ #  # ]:          0 :         ScUndoUtil::MarkSimpleBlock( pDocShell, nCol1, nRow1, nTable, nCol2, nRow2, nTable );
    1340                 :            :     }
    1341                 :            : 
    1342                 :            : // erack! it's broadcasted
    1343                 :            : //  pDoc->SetDirty();
    1344                 :            : 
    1345                 :          0 :     SCTAB nVisTab = pViewShell->GetViewData()->GetTabNo();
    1346         [ #  # ]:          0 :     if ( nVisTab != nTab )
    1347         [ #  # ]:          0 :         pViewShell->SetTabNo( nTab );
    1348                 :            : 
    1349         [ #  # ]:          0 :     if (bMoveCells)
    1350         [ #  # ]:          0 :         pDocShell->PostPaint( 0,0,nTab, MAXCOL,MAXROW,nTab, PAINT_GRID );
    1351                 :            :     else
    1352                 :            :         pDocShell->PostPaint( aImportParam.nCol1,aImportParam.nRow1,nTab,
    1353         [ #  # ]:          0 :                                 nEndCol,nEndRow,nTab, PAINT_GRID );
    1354         [ #  # ]:          0 :     pDocShell->PostDataChanged();
    1355                 :            : 
    1356         [ #  # ]:          0 :     EndUndo();
    1357                 :          0 : }
    1358                 :            : 
    1359                 :          0 : void ScUndoImportData::Redo()
    1360                 :            : {
    1361         [ #  # ]:          0 :     BeginRedo();
    1362                 :            : 
    1363                 :          0 :     ScDocument* pDoc = pDocShell->GetDocument();
    1364         [ #  # ]:          0 :     ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
    1365                 :            : 
    1366                 :            :     ScUndoUtil::MarkSimpleBlock( pDocShell, aImportParam.nCol1,aImportParam.nRow1,nTab,
    1367         [ #  # ]:          0 :                                                         nEndCol,nEndRow,nTab );
    1368                 :            : 
    1369                 :            :     SCTAB nTable;
    1370                 :            :     SCCOL nCol1, nCol2;
    1371                 :            :     SCROW nRow1, nRow2;
    1372                 :          0 :     ScDBData* pCurrentData = NULL;
    1373 [ #  # ][ #  # ]:          0 :     if (pUndoDBData && pRedoDBData)
    1374                 :            :     {
    1375         [ #  # ]:          0 :         pUndoDBData->GetArea( nTable, nCol1, nRow1, nCol2, nRow2 );
    1376                 :            :         pCurrentData = ScUndoUtil::GetOldDBData( pUndoDBData, pDoc, nTab,
    1377         [ #  # ]:          0 :                                                     nCol1, nRow1, nCol2, nRow2 );
    1378                 :            :     }
    1379                 :            :     sal_Bool bMoveCells = pUndoDBData && pRedoDBData &&
    1380 [ #  # ][ #  # ]:          0 :                         pRedoDBData->IsDoSize();        // in alt und neu gleich
                 [ #  # ]
    1381         [ #  # ]:          0 :     if (bMoveCells)
    1382                 :            :     {
    1383                 :            :         //  Redo: FitBlock, dann Daten loeschen (noetig fuer CopyToDocument)
    1384                 :            : 
    1385                 :          0 :         ScRange aOld, aNew;
    1386         [ #  # ]:          0 :         pUndoDBData->GetArea( aOld );
    1387         [ #  # ]:          0 :         pRedoDBData->GetArea( aNew );
    1388                 :            : 
    1389                 :          0 :         aOld.aEnd.SetCol( aOld.aEnd.Col() + nFormulaCols );     // FitBlock auch fuer Formeln
    1390                 :          0 :         aNew.aEnd.SetCol( aNew.aEnd.Col() + nFormulaCols );
    1391         [ #  # ]:          0 :         pDoc->FitBlock( aOld, aNew );
    1392                 :            : 
    1393                 :          0 :         pDoc->DeleteAreaTab( aNew.aStart.Col(), aNew.aStart.Row(),
    1394         [ #  # ]:          0 :                                 aNew.aEnd.Col(), aNew.aEnd.Row(), nTab, IDF_ALL & ~IDF_NOTE );
    1395                 :            : 
    1396         [ #  # ]:          0 :         pRedoDoc->CopyToDocument( aNew, IDF_ALL & ~IDF_NOTE, false, pDoc );        // incl. Formeln
    1397                 :            :     }
    1398                 :            :     else
    1399                 :            :     {
    1400                 :            :         pDoc->DeleteAreaTab( aImportParam.nCol1,aImportParam.nRow1,
    1401         [ #  # ]:          0 :                                 nEndCol,nEndRow, nTab, IDF_ALL & ~IDF_NOTE );
    1402                 :            :         pRedoDoc->CopyToDocument( aImportParam.nCol1,aImportParam.nRow1,nTab,
    1403         [ #  # ]:          0 :                                 nEndCol,nEndRow,nTab, IDF_ALL & ~IDF_NOTE, false, pDoc );
    1404                 :            :     }
    1405                 :            : 
    1406         [ #  # ]:          0 :     if (pCurrentData)
    1407                 :            :     {
    1408         [ #  # ]:          0 :         *pCurrentData = *pRedoDBData;
    1409                 :            : 
    1410         [ #  # ]:          0 :         pRedoDBData->GetArea( nTable, nCol1, nRow1, nCol2, nRow2 );
    1411         [ #  # ]:          0 :         ScUndoUtil::MarkSimpleBlock( pDocShell, nCol1, nRow1, nTable, nCol2, nRow2, nTable );
    1412                 :            :     }
    1413                 :            : 
    1414                 :            : // erack! it's broadcasted
    1415                 :            : //  pDoc->SetDirty();
    1416                 :            : 
    1417                 :          0 :     SCTAB nVisTab = pViewShell->GetViewData()->GetTabNo();
    1418         [ #  # ]:          0 :     if ( nVisTab != nTab )
    1419         [ #  # ]:          0 :         pViewShell->SetTabNo( nTab );
    1420                 :            : 
    1421         [ #  # ]:          0 :     if (bMoveCells)
    1422         [ #  # ]:          0 :         pDocShell->PostPaint( 0,0,nTab, MAXCOL,MAXROW,nTab, PAINT_GRID );
    1423                 :            :     else
    1424                 :            :         pDocShell->PostPaint( aImportParam.nCol1,aImportParam.nRow1,nTab,
    1425         [ #  # ]:          0 :                                 nEndCol,nEndRow,nTab, PAINT_GRID );
    1426         [ #  # ]:          0 :     pDocShell->PostDataChanged();
    1427                 :            : 
    1428         [ #  # ]:          0 :     EndRedo();
    1429                 :          0 : }
    1430                 :            : 
    1431                 :          0 : void ScUndoImportData::Repeat(SfxRepeatTarget& rTarget)
    1432                 :            : {
    1433         [ #  # ]:          0 :     if (rTarget.ISA(ScTabViewTarget))
    1434                 :            :     {
    1435                 :          0 :         ScTabViewShell& rViewShell = *((ScTabViewTarget&)rTarget).GetViewShell();
    1436                 :            : 
    1437                 :            :         SCTAB nDummy;
    1438         [ #  # ]:          0 :         ScImportParam aNewParam(aImportParam);
    1439         [ #  # ]:          0 :         ScDBData* pDBData = rViewShell.GetDBData();
    1440         [ #  # ]:          0 :         pDBData->GetArea( nDummy, aNewParam.nCol1,aNewParam.nRow1, aNewParam.nCol2,aNewParam.nRow2 );
    1441                 :            : 
    1442 [ #  # ][ #  # ]:          0 :         rViewShell.ImportData( aNewParam );
    1443                 :            :     }
    1444                 :          0 : }
    1445                 :            : 
    1446                 :          2 : sal_Bool ScUndoImportData::CanRepeat(SfxRepeatTarget& rTarget) const
    1447                 :            : {
    1448                 :            :     //  Repeat nur fuer Import per DB-Bereich, dann ist pUndoDBData gesetzt
    1449                 :            : 
    1450         [ +  - ]:          2 :     if (pUndoDBData)
    1451                 :          2 :         return (rTarget.ISA(ScTabViewTarget));
    1452                 :            :     else
    1453                 :          2 :         return false;       // Adressbuch
    1454                 :            : }
    1455                 :            : 
    1456                 :            : //
    1457                 :            : //      Operationen wiederholen
    1458                 :            : //
    1459                 :            : 
    1460                 :          2 : ScUndoRepeatDB::ScUndoRepeatDB( ScDocShell* pNewDocShell, SCTAB nNewTab,
    1461                 :            :                                 SCCOL nStartX, SCROW nStartY, SCCOL nEndX, SCROW nEndY,
    1462                 :            :                                 SCROW nResultEndRow, SCCOL nCurX, SCROW nCurY,
    1463                 :            :                                 ScDocument* pNewUndoDoc, ScOutlineTable* pNewUndoTab,
    1464                 :            :                                 ScRangeName* pNewUndoRange, ScDBCollection* pNewUndoDB,
    1465                 :            :                                 const ScRange* pOldQ, const ScRange* pNewQ ) :
    1466                 :            :     ScSimpleUndo( pNewDocShell ),
    1467                 :            :     aBlockStart( nStartX,nStartY,nNewTab ),
    1468                 :            :     aBlockEnd( nEndX,nEndY,nNewTab ),
    1469                 :            :     nNewEndRow( nResultEndRow ),
    1470                 :            :     aCursorPos( nCurX,nCurY,nNewTab ),
    1471                 :            :     pUndoDoc( pNewUndoDoc ),
    1472                 :            :     pUndoTable( pNewUndoTab ),
    1473                 :            :     pUndoRange( pNewUndoRange ),
    1474                 :            :     pUndoDB( pNewUndoDB ),
    1475                 :          2 :     bQuerySize( false )
    1476                 :            : {
    1477 [ #  # ][ -  + ]:          2 :     if ( pOldQ && pNewQ )
    1478                 :            :     {
    1479                 :          0 :         aOldQuery = *pOldQ;
    1480                 :          0 :         aNewQuery = *pNewQ;
    1481                 :          0 :         bQuerySize = sal_True;;
    1482                 :            :     }
    1483                 :          2 : }
    1484                 :            : 
    1485                 :          2 : ScUndoRepeatDB::~ScUndoRepeatDB()
    1486                 :            : {
    1487 [ +  - ][ +  - ]:          2 :     delete pUndoDoc;
    1488 [ -  + ][ #  # ]:          2 :     delete pUndoTable;
    1489 [ -  + ][ #  # ]:          2 :     delete pUndoRange;
    1490 [ +  - ][ +  - ]:          2 :     delete pUndoDB;
    1491         [ -  + ]:          4 : }
    1492                 :            : 
    1493                 :          2 : rtl::OUString ScUndoRepeatDB::GetComment() const
    1494                 :            : {   // "Wiederholen";       //! bessere Beschreibung!
    1495                 :          2 :     return ScGlobal::GetRscString( STR_UNDO_REPEATDB );
    1496                 :            : }
    1497                 :            : 
    1498                 :          0 : void ScUndoRepeatDB::Undo()
    1499                 :            : {
    1500                 :          0 :     BeginUndo();
    1501                 :            : 
    1502                 :          0 :     ScDocument* pDoc = pDocShell->GetDocument();
    1503                 :          0 :     ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
    1504                 :          0 :     SCTAB nTab = aBlockStart.Tab();
    1505                 :            : 
    1506         [ #  # ]:          0 :     if (bQuerySize)
    1507                 :            :     {
    1508                 :          0 :         pDoc->FitBlock( aNewQuery, aOldQuery, false );
    1509                 :            : 
    1510         [ #  # ]:          0 :         if ( aNewQuery.aEnd.Col() == aOldQuery.aEnd.Col() )
    1511                 :            :         {
    1512                 :          0 :             SCCOL nFormulaCols = 0;
    1513                 :          0 :             SCCOL nCol = aOldQuery.aEnd.Col() + 1;
    1514                 :          0 :             SCROW nRow = aOldQuery.aStart.Row() + 1;        //! Header testen
    1515 [ #  # ][ #  # ]:          0 :             while ( nCol <= MAXCOL &&
                 [ #  # ]
    1516 [ #  # ][ #  # ]:          0 :                     pDoc->GetCellType(ScAddress( nCol, nRow, nTab )) == CELLTYPE_FORMULA )
                 [ #  # ]
    1517                 :          0 :                 ++nCol, ++nFormulaCols;
    1518                 :            : 
    1519         [ #  # ]:          0 :             if ( nFormulaCols > 0 )
    1520                 :            :             {
    1521                 :          0 :                 ScRange aOldForm = aOldQuery;
    1522                 :          0 :                 aOldForm.aStart.SetCol( aOldQuery.aEnd.Col() + 1 );
    1523                 :          0 :                 aOldForm.aEnd.SetCol( aOldQuery.aEnd.Col() + nFormulaCols );
    1524                 :          0 :                 ScRange aNewForm = aOldForm;
    1525                 :          0 :                 aNewForm.aEnd.SetRow( aNewQuery.aEnd.Row() );
    1526         [ #  # ]:          0 :                 pDoc->FitBlock( aNewForm, aOldForm, false );
    1527                 :            :             }
    1528                 :            :         }
    1529                 :            :     }
    1530                 :            : 
    1531                 :            :     //!     Daten von Filter in anderen Bereich fehlen noch !!!!!!!!!!!!!!!!!
    1532                 :            : 
    1533         [ #  # ]:          0 :     if (nNewEndRow > aBlockEnd.Row())
    1534                 :            :     {
    1535                 :          0 :         pDoc->DeleteRow( 0,nTab, MAXCOL,nTab, aBlockEnd.Row()+1, static_cast<SCSIZE>(nNewEndRow-aBlockEnd.Row()) );
    1536                 :            :     }
    1537         [ #  # ]:          0 :     else if (nNewEndRow < aBlockEnd.Row())
    1538                 :            :     {
    1539                 :          0 :         pDoc->InsertRow( 0,nTab, MAXCOL,nTab, nNewEndRow+1, static_cast<SCSIZE>(nNewEndRow-aBlockEnd.Row()) );
    1540                 :            :     }
    1541                 :            : 
    1542                 :            :     //  Original Outline-Table
    1543                 :            : 
    1544                 :          0 :     pDoc->SetOutlineTable( nTab, pUndoTable );
    1545                 :            : 
    1546                 :            :     //  Original Spalten-/Zeilenstatus
    1547                 :            : 
    1548 [ #  # ][ #  # ]:          0 :     if (pUndoDoc && pUndoTable)
    1549                 :            :     {
    1550                 :            :         SCCOLROW nStartCol;
    1551                 :            :         SCCOLROW nStartRow;
    1552                 :            :         SCCOLROW nEndCol;
    1553                 :            :         SCCOLROW nEndRow;
    1554         [ #  # ]:          0 :         pUndoTable->GetColArray()->GetRange( nStartCol, nEndCol );
    1555         [ #  # ]:          0 :         pUndoTable->GetRowArray()->GetRange( nStartRow, nEndRow );
    1556                 :            : 
    1557                 :            :         pUndoDoc->CopyToDocument( static_cast<SCCOL>(nStartCol), 0, nTab,
    1558                 :            :                 static_cast<SCCOL>(nEndCol), MAXROW, nTab, IDF_NONE, false,
    1559         [ #  # ]:          0 :                 pDoc );
    1560         [ #  # ]:          0 :         pUndoDoc->CopyToDocument( 0, nStartRow, nTab, MAXCOL, nEndRow, nTab, IDF_NONE, false, pDoc );
    1561                 :            : 
    1562         [ #  # ]:          0 :         pViewShell->UpdateScrollBars();
    1563                 :            :     }
    1564                 :            : 
    1565                 :            :     //  Original-Daten & Referenzen
    1566                 :            : 
    1567                 :            :     ScUndoUtil::MarkSimpleBlock( pDocShell, 0, aBlockStart.Row(), nTab,
    1568                 :          0 :                                             MAXCOL, aBlockEnd.Row(), nTab );
    1569                 :            :     pDoc->DeleteAreaTab( 0, aBlockStart.Row(),
    1570                 :          0 :                             MAXCOL, aBlockEnd.Row(), nTab, IDF_ALL );
    1571                 :            : 
    1572                 :            :     pUndoDoc->CopyToDocument( 0, aBlockStart.Row(), nTab, MAXCOL, aBlockEnd.Row(), nTab,
    1573                 :          0 :                                                             IDF_NONE, false, pDoc );            // Flags
    1574                 :            :     pUndoDoc->UndoToDocument( 0, aBlockStart.Row(), nTab, MAXCOL, aBlockEnd.Row(), nTab,
    1575                 :          0 :                                                             IDF_ALL, false, pDoc );
    1576                 :            : 
    1577                 :          0 :     ScUndoUtil::MarkSimpleBlock( pDocShell, aBlockStart.Col(),aBlockStart.Row(),nTab,
    1578                 :          0 :                                             aBlockEnd.Col(),aBlockEnd.Row(),nTab );
    1579                 :            : 
    1580         [ #  # ]:          0 :     if (pUndoRange)
    1581         [ #  # ]:          0 :         pDoc->SetRangeName( new ScRangeName( *pUndoRange ) );
    1582         [ #  # ]:          0 :     if (pUndoDB)
    1583         [ #  # ]:          0 :         pDoc->SetDBCollection( new ScDBCollection( *pUndoDB ), sal_True );
    1584                 :            : 
    1585                 :            : // erack! it's broadcasted
    1586                 :            : //  pDoc->SetDirty();
    1587                 :            : 
    1588                 :          0 :     SCTAB nVisTab = pViewShell->GetViewData()->GetTabNo();
    1589         [ #  # ]:          0 :     if ( nVisTab != nTab )
    1590                 :          0 :         pViewShell->SetTabNo( nTab );
    1591                 :            : 
    1592                 :          0 :     pDocShell->PostPaint(0,0,nTab,MAXCOL,MAXROW,nTab,PAINT_GRID|PAINT_LEFT|PAINT_TOP|PAINT_SIZE);
    1593                 :          0 :     pDocShell->PostDataChanged();
    1594                 :            : 
    1595                 :          0 :     EndUndo();
    1596                 :          0 : }
    1597                 :            : 
    1598                 :          0 : void ScUndoRepeatDB::Redo()
    1599                 :            : {
    1600                 :          0 :     BeginRedo();
    1601                 :            : 
    1602                 :          0 :     ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
    1603                 :          0 :     SCTAB nTab = aBlockStart.Tab();
    1604                 :            : 
    1605                 :          0 :     SCTAB nVisTab = pViewShell->GetViewData()->GetTabNo();
    1606         [ #  # ]:          0 :     if ( nVisTab != nTab )
    1607                 :          0 :         pViewShell->SetTabNo( nTab );
    1608                 :            : 
    1609                 :          0 :     ScUndoUtil::MarkSimpleBlock( pDocShell, aBlockStart.Col(),aBlockStart.Row(),nTab,
    1610                 :          0 :                                             aBlockEnd.Col(),aBlockEnd.Row(),nTab );
    1611                 :          0 :     pViewShell->SetCursor( aCursorPos.Col(), aCursorPos.Row() );
    1612                 :            : 
    1613                 :          0 :     pViewShell->RepeatDB( false );
    1614                 :            : 
    1615                 :          0 :     EndRedo();
    1616                 :          0 : }
    1617                 :            : 
    1618                 :          0 : void ScUndoRepeatDB::Repeat(SfxRepeatTarget& rTarget)
    1619                 :            : {
    1620         [ #  # ]:          0 :     if (rTarget.ISA(ScTabViewTarget))
    1621                 :          0 :         ((ScTabViewTarget&)rTarget).GetViewShell()->RepeatDB( sal_True );
    1622                 :          0 : }
    1623                 :            : 
    1624                 :          0 : sal_Bool ScUndoRepeatDB::CanRepeat(SfxRepeatTarget& rTarget) const
    1625                 :            : {
    1626                 :          0 :     return (rTarget.ISA(ScTabViewTarget));
    1627                 :            : }
    1628                 :            : 
    1629                 :            : //
    1630                 :            : //      data pilot
    1631                 :            : //
    1632                 :            : 
    1633                 :         62 : ScUndoDataPilot::ScUndoDataPilot( ScDocShell* pNewDocShell,
    1634                 :            :                             ScDocument* pOldDoc, ScDocument* pNewDoc,
    1635                 :            :                             const ScDPObject* pOldObj, const ScDPObject* pNewObj, sal_Bool bMove ) :
    1636                 :            :     ScSimpleUndo( pNewDocShell ),
    1637                 :            :     pOldUndoDoc( pOldDoc ),
    1638                 :            :     pNewUndoDoc( pNewDoc ),
    1639                 :            :     pOldDPObject( NULL ),
    1640                 :            :     pNewDPObject( NULL ),
    1641                 :         62 :     bAllowMove( bMove )
    1642                 :            : {
    1643         [ +  + ]:         62 :     if (pOldObj)
    1644 [ +  - ][ +  - ]:         43 :         pOldDPObject = new ScDPObject( *pOldObj );
    1645         [ +  + ]:         62 :     if (pNewObj)
    1646 [ +  - ][ +  - ]:         61 :         pNewDPObject = new ScDPObject( *pNewObj );
    1647                 :         62 : }
    1648                 :            : 
    1649                 :         62 : ScUndoDataPilot::~ScUndoDataPilot()
    1650                 :            : {
    1651 [ +  + ][ +  - ]:         62 :     delete pOldDPObject;
    1652 [ +  + ][ +  - ]:         62 :     delete pNewDPObject;
    1653 [ +  + ][ +  - ]:         62 :     delete pOldUndoDoc;
    1654 [ +  + ][ +  - ]:         62 :     delete pNewUndoDoc;
    1655         [ -  + ]:        124 : }
    1656                 :            : 
    1657                 :         76 : rtl::OUString ScUndoDataPilot::GetComment() const
    1658                 :            : {
    1659                 :            :     sal_uInt16 nIndex;
    1660 [ +  + ][ +  + ]:         76 :     if ( pOldUndoDoc && pNewUndoDoc )
    1661                 :         42 :         nIndex = STR_UNDO_PIVOT_MODIFY;
    1662         [ +  + ]:         34 :     else if ( pNewUndoDoc )
    1663                 :         33 :         nIndex = STR_UNDO_PIVOT_NEW;
    1664                 :            :     else
    1665                 :          1 :         nIndex = STR_UNDO_PIVOT_DELETE;
    1666                 :            : 
    1667                 :         76 :     return ScGlobal::GetRscString( nIndex );
    1668                 :            : }
    1669                 :            : 
    1670                 :          0 : void ScUndoDataPilot::Undo()
    1671                 :            : {
    1672         [ #  # ]:          0 :     BeginUndo();
    1673                 :            : 
    1674                 :          0 :     ScDocument* pDoc = pDocShell->GetDocument();
    1675                 :            : 
    1676                 :          0 :     ScRange aOldRange;
    1677                 :          0 :     ScRange aNewRange;
    1678                 :            : 
    1679 [ #  # ][ #  # ]:          0 :     if ( pNewDPObject && pNewUndoDoc )
    1680                 :            :     {
    1681                 :          0 :         aNewRange = pNewDPObject->GetOutRange();
    1682         [ #  # ]:          0 :         pDoc->DeleteAreaTab( aNewRange, IDF_ALL );
    1683         [ #  # ]:          0 :         pNewUndoDoc->CopyToDocument( aNewRange, IDF_ALL, false, pDoc );
    1684                 :            :     }
    1685 [ #  # ][ #  # ]:          0 :     if ( pOldDPObject && pOldUndoDoc )
    1686                 :            :     {
    1687                 :          0 :         aOldRange = pOldDPObject->GetOutRange();
    1688         [ #  # ]:          0 :         pDoc->DeleteAreaTab( aOldRange, IDF_ALL );
    1689         [ #  # ]:          0 :         pOldUndoDoc->CopyToDocument( aOldRange, IDF_ALL, false, pDoc );
    1690                 :            :     }
    1691                 :            : 
    1692                 :            :     //  update objects in collection
    1693                 :            : 
    1694         [ #  # ]:          0 :     if ( pNewDPObject )
    1695                 :            :     {
    1696                 :            :         //  find updated object
    1697                 :            :         //! find by name!
    1698                 :            : 
    1699                 :            :         ScDPObject* pDocObj = pDoc->GetDPAtCursor(
    1700         [ #  # ]:          0 :                             aNewRange.aStart.Col(), aNewRange.aStart.Row(), aNewRange.aStart.Tab() );
    1701                 :            :         OSL_ENSURE(pDocObj, "DPObject not found");
    1702         [ #  # ]:          0 :         if (pDocObj)
    1703                 :            :         {
    1704         [ #  # ]:          0 :             if ( pOldDPObject )
    1705                 :            :             {
    1706                 :            :                 //  restore old settings
    1707         [ #  # ]:          0 :                 pOldDPObject->WriteSourceDataTo( *pDocObj );
    1708                 :          0 :                 ScDPSaveData* pData = pOldDPObject->GetSaveData();
    1709         [ #  # ]:          0 :                 if (pData)
    1710         [ #  # ]:          0 :                     pDocObj->SetSaveData(*pData);
    1711         [ #  # ]:          0 :                 pDocObj->SetOutRange( pOldDPObject->GetOutRange() );
    1712         [ #  # ]:          0 :                 pOldDPObject->WriteTempDataTo( *pDocObj );
    1713                 :            :             }
    1714                 :            :             else
    1715                 :            :             {
    1716                 :            :                 //  delete inserted object
    1717 [ #  # ][ #  # ]:          0 :                 pDoc->GetDPCollection()->FreeTable(pDocObj);
    1718                 :            :             }
    1719                 :            :         }
    1720                 :            :     }
    1721         [ #  # ]:          0 :     else if ( pOldDPObject )
    1722                 :            :     {
    1723                 :            :         //  re-insert deleted object
    1724                 :            : 
    1725 [ #  # ][ #  # ]:          0 :         ScDPObject* pDestObj = new ScDPObject( *pOldDPObject );
    1726         [ #  # ]:          0 :         pDestObj->SetAlive(sal_True);
    1727 [ #  # ][ #  # ]:          0 :         if ( !pDoc->GetDPCollection()->InsertNewTable(pDestObj) )
                 [ #  # ]
    1728                 :            :         {
    1729                 :            :             OSL_FAIL("cannot insert DPObject");
    1730 [ #  # ][ #  # ]:          0 :             DELETEZ( pDestObj );
    1731                 :            :         }
    1732                 :            :     }
    1733                 :            : 
    1734         [ #  # ]:          0 :     if (pNewUndoDoc)
    1735 [ #  # ][ #  # ]:          0 :         pDocShell->PostPaint( aNewRange, PAINT_GRID, SC_PF_LINES );
                 [ #  # ]
    1736         [ #  # ]:          0 :     if (pOldUndoDoc)
    1737 [ #  # ][ #  # ]:          0 :         pDocShell->PostPaint( aOldRange, PAINT_GRID, SC_PF_LINES );
                 [ #  # ]
    1738         [ #  # ]:          0 :     pDocShell->PostDataChanged();
    1739                 :            : 
    1740         [ #  # ]:          0 :     ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
    1741                 :            :     if (pViewShell)
    1742                 :            :     {
    1743                 :            :         //! set current sheet
    1744                 :            :     }
    1745                 :            : 
    1746         [ #  # ]:          0 :     if (pNewDPObject)
    1747                 :            :     {
    1748                 :            :         // notify API objects
    1749 [ #  # ][ #  # ]:          0 :         pDoc->BroadcastUno( ScDataPilotModifiedHint( pNewDPObject->GetName() ) );
         [ #  # ][ #  # ]
                 [ #  # ]
    1750                 :            :     }
    1751                 :            : 
    1752         [ #  # ]:          0 :     EndUndo();
    1753                 :          0 : }
    1754                 :            : 
    1755                 :          0 : void ScUndoDataPilot::Redo()
    1756                 :            : {
    1757         [ #  # ]:          0 :     BeginRedo();
    1758                 :            : 
    1759                 :            :     //! copy output data instead of repeating the change,
    1760                 :            :     //! in case external data have changed!
    1761                 :            : 
    1762                 :          0 :     ScDocument* pDoc = pDocShell->GetDocument();
    1763                 :            : 
    1764                 :          0 :     ScDPObject* pSourceObj = NULL;
    1765         [ #  # ]:          0 :     if ( pOldDPObject )
    1766                 :            :     {
    1767                 :            :         //  find object to modify
    1768                 :            :         //! find by name!
    1769                 :            : 
    1770                 :          0 :         ScRange aOldRange = pOldDPObject->GetOutRange();
    1771                 :            :         pSourceObj = pDoc->GetDPAtCursor(
    1772         [ #  # ]:          0 :                         aOldRange.aStart.Col(), aOldRange.aStart.Row(), aOldRange.aStart.Tab() );
    1773                 :            :         OSL_ENSURE(pSourceObj, "DPObject not found");
    1774                 :            :     }
    1775                 :            : 
    1776                 :          0 :     ScDBDocFunc aFunc( *pDocShell );
    1777         [ #  # ]:          0 :     aFunc.DataPilotUpdate( pSourceObj, pNewDPObject, false, false, bAllowMove );    // no new undo action
    1778                 :            : 
    1779         [ #  # ]:          0 :     EndRedo();
    1780                 :          0 : }
    1781                 :            : 
    1782                 :          0 : void ScUndoDataPilot::Repeat(SfxRepeatTarget& /* rTarget */)
    1783                 :            : {
    1784                 :            :     //! allow deletion
    1785                 :          0 : }
    1786                 :            : 
    1787                 :         14 : sal_Bool ScUndoDataPilot::CanRepeat(SfxRepeatTarget& /* rTarget */) const
    1788                 :            : {
    1789                 :            :     //! allow deletion
    1790                 :         14 :     return false;
    1791                 :            : }
    1792                 :            : 
    1793                 :            : 
    1794                 :            : //
    1795                 :            : //      Konsolidieren
    1796                 :            : //
    1797                 :            : 
    1798                 :          0 : ScUndoConsolidate::ScUndoConsolidate( ScDocShell* pNewDocShell, const ScArea& rArea,
    1799                 :            :                     const ScConsolidateParam& rPar, ScDocument* pNewUndoDoc,
    1800                 :            :                     sal_Bool bReference, SCROW nInsCount, ScOutlineTable* pTab,
    1801                 :            :                     ScDBData* pData ) :
    1802                 :            :     ScSimpleUndo( pNewDocShell ),
    1803                 :            :     aDestArea( rArea ),
    1804                 :            :     pUndoDoc( pNewUndoDoc ),
    1805                 :            :     aParam( rPar ),
    1806                 :            :     bInsRef( bReference ),
    1807                 :            :     nInsertCount( nInsCount ),
    1808                 :            :     pUndoTab( pTab ),
    1809 [ #  # ][ #  # ]:          0 :     pUndoData( pData )
    1810                 :            : {
    1811                 :          0 : }
    1812                 :            : 
    1813         [ #  # ]:          0 : ScUndoConsolidate::~ScUndoConsolidate()
    1814                 :            : {
    1815 [ #  # ][ #  # ]:          0 :     delete pUndoDoc;
    1816 [ #  # ][ #  # ]:          0 :     delete pUndoTab;
    1817 [ #  # ][ #  # ]:          0 :     delete pUndoData;
    1818         [ #  # ]:          0 : }
    1819                 :            : 
    1820                 :          0 : rtl::OUString ScUndoConsolidate::GetComment() const
    1821                 :            : {
    1822                 :          0 :     return ScGlobal::GetRscString( STR_UNDO_CONSOLIDATE );
    1823                 :            : }
    1824                 :            : 
    1825                 :          0 : void ScUndoConsolidate::Undo()
    1826                 :            : {
    1827         [ #  # ]:          0 :     BeginUndo();
    1828                 :            : 
    1829                 :          0 :     ScDocument* pDoc = pDocShell->GetDocument();
    1830                 :          0 :     SCTAB nTab = aDestArea.nTab;
    1831                 :            : 
    1832                 :          0 :     ScRange aOldRange;
    1833         [ #  # ]:          0 :     if (pUndoData)
    1834         [ #  # ]:          0 :         pUndoData->GetArea(aOldRange);
    1835                 :            : 
    1836         [ #  # ]:          0 :     if (bInsRef)
    1837                 :            :     {
    1838                 :            :         //  Zeilen loeschen
    1839         [ #  # ]:          0 :         pDoc->DeleteRow( 0,nTab, MAXCOL,nTab, aDestArea.nRowStart, nInsertCount );
    1840                 :            : 
    1841                 :            :         //  Outlines
    1842         [ #  # ]:          0 :         pDoc->SetOutlineTable( nTab, pUndoTab );
    1843                 :            : 
    1844                 :            :         //  Zeilenstatus
    1845         [ #  # ]:          0 :         pUndoDoc->CopyToDocument( 0,0,nTab, MAXCOL,MAXROW,nTab, IDF_NONE, false, pDoc );
    1846                 :            : 
    1847                 :            :         //  Daten & Referenzen
    1848         [ #  # ]:          0 :         pDoc->DeleteAreaTab( 0,aDestArea.nRowStart, MAXCOL,aDestArea.nRowEnd, nTab, IDF_ALL );
    1849                 :            :         pUndoDoc->UndoToDocument( 0, aDestArea.nRowStart, nTab,
    1850                 :            :                                     MAXCOL, aDestArea.nRowEnd, nTab,
    1851         [ #  # ]:          0 :                                     IDF_ALL, false, pDoc );
    1852                 :            : 
    1853                 :            :         //  Original-Bereich
    1854         [ #  # ]:          0 :         if (pUndoData)
    1855                 :            :         {
    1856         [ #  # ]:          0 :             pDoc->DeleteAreaTab(aOldRange, IDF_ALL);
    1857         [ #  # ]:          0 :             pUndoDoc->CopyToDocument(aOldRange, IDF_ALL, false, pDoc);
    1858                 :            :         }
    1859                 :            : 
    1860                 :            :         pDocShell->PostPaint( 0,aDestArea.nRowStart,nTab, MAXCOL,MAXROW,nTab,
    1861         [ #  # ]:          0 :                                 PAINT_GRID | PAINT_LEFT | PAINT_SIZE );
    1862                 :            :     }
    1863                 :            :     else
    1864                 :            :     {
    1865                 :            :         pDoc->DeleteAreaTab( aDestArea.nColStart,aDestArea.nRowStart,
    1866         [ #  # ]:          0 :                                 aDestArea.nColEnd,aDestArea.nRowEnd, nTab, IDF_ALL );
    1867                 :            :         pUndoDoc->CopyToDocument( aDestArea.nColStart, aDestArea.nRowStart, nTab,
    1868                 :            :                                     aDestArea.nColEnd, aDestArea.nRowEnd, nTab,
    1869         [ #  # ]:          0 :                                     IDF_ALL, false, pDoc );
    1870                 :            : 
    1871                 :            :         //  Original-Bereich
    1872         [ #  # ]:          0 :         if (pUndoData)
    1873                 :            :         {
    1874         [ #  # ]:          0 :             pDoc->DeleteAreaTab(aOldRange, IDF_ALL);
    1875         [ #  # ]:          0 :             pUndoDoc->CopyToDocument(aOldRange, IDF_ALL, false, pDoc);
    1876                 :            :         }
    1877                 :            : 
    1878                 :          0 :         SCCOL nEndX = aDestArea.nColEnd;
    1879                 :          0 :         SCROW nEndY = aDestArea.nRowEnd;
    1880         [ #  # ]:          0 :         if ( pUndoData )
    1881                 :            :         {
    1882         [ #  # ]:          0 :             if ( aOldRange.aEnd.Col() > nEndX )
    1883                 :          0 :                 nEndX = aOldRange.aEnd.Col();
    1884         [ #  # ]:          0 :             if ( aOldRange.aEnd.Row() > nEndY )
    1885                 :          0 :                 nEndY = aOldRange.aEnd.Row();
    1886                 :            :         }
    1887                 :            :         pDocShell->PostPaint( aDestArea.nColStart, aDestArea.nRowStart, nTab,
    1888         [ #  # ]:          0 :                                     nEndX, nEndY, nTab, PAINT_GRID );
    1889                 :            :     }
    1890                 :            : 
    1891                 :            :     //  DB-Bereich wieder anpassen
    1892         [ #  # ]:          0 :     if (pUndoData)
    1893                 :            :     {
    1894         [ #  # ]:          0 :         ScDBCollection* pColl = pDoc->GetDBCollection();
    1895         [ #  # ]:          0 :         if (pColl)
    1896                 :            :         {
    1897 [ #  # ][ #  # ]:          0 :             ScDBData* pDocData = pColl->getNamedDBs().findByName(pUndoData->GetName());
    1898         [ #  # ]:          0 :             if (pDocData)
    1899         [ #  # ]:          0 :                 *pDocData = *pUndoData;
    1900                 :            :         }
    1901                 :            :     }
    1902                 :            : 
    1903         [ #  # ]:          0 :     ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
    1904         [ #  # ]:          0 :     if (pViewShell)
    1905                 :            :     {
    1906                 :          0 :         SCTAB nViewTab = pViewShell->GetViewData()->GetTabNo();
    1907         [ #  # ]:          0 :         if ( nViewTab != nTab )
    1908         [ #  # ]:          0 :             pViewShell->SetTabNo( nTab );
    1909                 :            :     }
    1910                 :            : 
    1911         [ #  # ]:          0 :     EndUndo();
    1912                 :          0 : }
    1913                 :            : 
    1914                 :          0 : void ScUndoConsolidate::Redo()
    1915                 :            : {
    1916                 :          0 :     BeginRedo();
    1917                 :            : 
    1918                 :          0 :     pDocShell->DoConsolidate( aParam, false );
    1919                 :            : 
    1920                 :          0 :     ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
    1921         [ #  # ]:          0 :     if (pViewShell)
    1922                 :            :     {
    1923                 :          0 :         SCTAB nViewTab = pViewShell->GetViewData()->GetTabNo();
    1924         [ #  # ]:          0 :         if ( nViewTab != aParam.nTab )
    1925                 :          0 :             pViewShell->SetTabNo( aParam.nTab );
    1926                 :            :     }
    1927                 :            : 
    1928                 :          0 :     EndRedo();
    1929                 :          0 : }
    1930                 :            : 
    1931                 :          0 : void ScUndoConsolidate::Repeat(SfxRepeatTarget& /* rTarget */)
    1932                 :            : {
    1933                 :          0 : }
    1934                 :            : 
    1935                 :          0 : sal_Bool ScUndoConsolidate::CanRepeat(SfxRepeatTarget& /* rTarget */) const
    1936                 :            : {
    1937                 :          0 :     return false;
    1938                 :            : }
    1939                 :            : 
    1940                 :            : 
    1941                 :            : //
    1942                 :            : //      Quell-Daten von Chart aendern
    1943                 :            : //
    1944                 :            : 
    1945                 :          6 : void ScUndoChartData::Init()
    1946                 :            : {
    1947                 :          6 :     ScDocument* pDoc = pDocShell->GetDocument();
    1948         [ +  - ]:          6 :     aOldRangeListRef = new ScRangeList;
    1949         [ +  - ]:          6 :     pDoc->GetOldChartParameters( aChartName, *aOldRangeListRef, bOldColHeaders, bOldRowHeaders );
    1950                 :          6 : }
    1951                 :            : 
    1952                 :          0 : ScUndoChartData::ScUndoChartData( ScDocShell* pNewDocShell, const String& rName,
    1953                 :            :                                     const ScRange& rNew, bool bColHdr, bool bRowHdr,
    1954                 :            :                                     bool bAdd ) :
    1955                 :            :     ScSimpleUndo( pNewDocShell ),
    1956                 :            :     aChartName( rName ),
    1957                 :            :     bNewColHeaders( bColHdr ),
    1958                 :            :     bNewRowHeaders( bRowHdr ),
    1959         [ #  # ]:          0 :     bAddRange( bAdd )
    1960                 :            : {
    1961 [ #  # ][ #  # ]:          0 :     aNewRangeListRef = new ScRangeList;
                 [ #  # ]
    1962         [ #  # ]:          0 :     aNewRangeListRef->Append( rNew );
    1963                 :            : 
    1964         [ #  # ]:          0 :     Init();
    1965                 :          0 : }
    1966                 :            : 
    1967                 :          6 : ScUndoChartData::ScUndoChartData( ScDocShell* pNewDocShell, const String& rName,
    1968                 :            :                                     const ScRangeListRef& rNew, bool bColHdr, bool bRowHdr,
    1969                 :            :                                     bool bAdd ) :
    1970                 :            :     ScSimpleUndo( pNewDocShell ),
    1971                 :            :     aChartName( rName ),
    1972                 :            :     aNewRangeListRef( rNew ),
    1973                 :            :     bNewColHeaders( bColHdr ),
    1974                 :            :     bNewRowHeaders( bRowHdr ),
    1975         [ +  - ]:          6 :     bAddRange( bAdd )
    1976                 :            : {
    1977         [ +  - ]:          6 :     Init();
    1978                 :          6 : }
    1979                 :            : 
    1980 [ +  - ][ +  - ]:          6 : ScUndoChartData::~ScUndoChartData()
                 [ +  - ]
    1981                 :            : {
    1982         [ -  + ]:         12 : }
    1983                 :            : 
    1984                 :          8 : rtl::OUString ScUndoChartData::GetComment() const
    1985                 :            : {
    1986                 :          8 :     return ScGlobal::GetRscString( STR_UNDO_CHARTDATA );
    1987                 :            : }
    1988                 :            : 
    1989                 :          0 : void ScUndoChartData::Undo()
    1990                 :            : {
    1991                 :          0 :     BeginUndo();
    1992                 :            : 
    1993                 :            :     pDocShell->GetDocument()->UpdateChartArea( aChartName, aOldRangeListRef,
    1994         [ #  # ]:          0 :                                 bOldColHeaders, bOldRowHeaders, false );
    1995                 :            : 
    1996                 :          0 :     EndUndo();
    1997                 :          0 : }
    1998                 :            : 
    1999                 :          0 : void ScUndoChartData::Redo()
    2000                 :            : {
    2001                 :          0 :     BeginRedo();
    2002                 :            : 
    2003                 :            :     pDocShell->GetDocument()->UpdateChartArea( aChartName, aNewRangeListRef,
    2004         [ #  # ]:          0 :                                 bNewColHeaders, bNewRowHeaders, bAddRange );
    2005                 :            : 
    2006                 :          0 :     EndRedo();
    2007                 :          0 : }
    2008                 :            : 
    2009                 :          0 : void ScUndoChartData::Repeat(SfxRepeatTarget& /* rTarget */)
    2010                 :            : {
    2011                 :          0 : }
    2012                 :            : 
    2013                 :          2 : sal_Bool ScUndoChartData::CanRepeat(SfxRepeatTarget& /* rTarget */) const
    2014                 :            : {
    2015                 :          2 :     return false;
    2016                 :            : }
    2017                 :            : 
    2018                 :          0 : ScUndoDataForm::ScUndoDataForm( ScDocShell* pNewDocShell,
    2019                 :            :                                 SCCOL nStartX, SCROW nStartY, SCTAB nStartZ,
    2020                 :            :                                 SCCOL nEndX, SCROW nEndY, SCTAB nEndZ,
    2021                 :            :                                 const ScMarkData& rMark,
    2022                 :            :                                 ScDocument* pNewUndoDoc, ScDocument* pNewRedoDoc,
    2023                 :            :                                 sal_uInt16 nNewFlags,
    2024                 :            :                                 ScRefUndoData* pRefData,
    2025                 :            :                                 void* /*pFill1*/, void* /*pFill2*/, void* /*pFill3*/,
    2026                 :            :                                 sal_Bool bRedoIsFilled ) :
    2027                 :            :         ScBlockUndo( pNewDocShell, ScRange( nStartX, nStartY, nStartZ, nEndX, nEndY, nEndZ ), SC_UNDO_SIMPLE ),
    2028         [ #  # ]:          0 :         mpMarkData(new ScMarkData(rMark)),
    2029                 :            :         pUndoDoc( pNewUndoDoc ),
    2030                 :            :         pRedoDoc( pNewRedoDoc ),
    2031                 :            :         nFlags( nNewFlags ),
    2032                 :            :         pRefUndoData( pRefData ),
    2033                 :            :         pRefRedoData( NULL ),
    2034 [ #  # ][ #  # ]:          0 :         bRedoFilled( bRedoIsFilled )
    2035                 :            : {
    2036                 :            :         //      pFill1,pFill2,pFill3 are there so the ctor calls for simple paste (without cutting)
    2037                 :            :         //      don't have to be changed and branched for 641.
    2038                 :            :         //      They can be removed later.
    2039                 :            : 
    2040         [ #  # ]:          0 :         if (!mpMarkData->IsMarked())                            // no cell marked:
    2041         [ #  # ]:          0 :                 mpMarkData->SetMarkArea(aBlockRange);   //  mark paste block
    2042                 :            : 
    2043         [ #  # ]:          0 :         if ( pRefUndoData )
    2044         [ #  # ]:          0 :                 pRefUndoData->DeleteUnchanged( pDocShell->GetDocument() );
    2045                 :            : 
    2046         [ #  # ]:          0 :         SetChangeTrack();
    2047                 :          0 : }
    2048                 :            : 
    2049         [ #  # ]:          0 : ScUndoDataForm::~ScUndoDataForm()
    2050                 :            : {
    2051 [ #  # ][ #  # ]:          0 :         delete pUndoDoc;
    2052 [ #  # ][ #  # ]:          0 :         delete pRedoDoc;
    2053 [ #  # ][ #  # ]:          0 :         delete pRefUndoData;
    2054 [ #  # ][ #  # ]:          0 :         delete pRefRedoData;
    2055         [ #  # ]:          0 : }
    2056                 :            : 
    2057                 :          0 : rtl::OUString ScUndoDataForm::GetComment() const
    2058                 :            : {
    2059                 :          0 :         return ScGlobal::GetRscString( STR_UNDO_PASTE );
    2060                 :            : }
    2061                 :            : 
    2062                 :          0 : void ScUndoDataForm::SetChangeTrack()
    2063                 :            : {
    2064                 :          0 :         ScChangeTrack* pChangeTrack = pDocShell->GetDocument()->GetChangeTrack();
    2065 [ #  # ][ #  # ]:          0 :         if ( pChangeTrack && (nFlags & IDF_CONTENTS) )
    2066                 :            :                 pChangeTrack->AppendContentRange( aBlockRange, pUndoDoc,
    2067                 :          0 :                         nStartChangeAction, nEndChangeAction, SC_CACM_PASTE );
    2068                 :            :         else
    2069                 :          0 :                 nStartChangeAction = nEndChangeAction = 0;
    2070                 :          0 : }
    2071                 :            : 
    2072                 :            : 
    2073                 :          0 : void ScUndoDataForm::Undo()
    2074                 :            : {
    2075                 :          0 :         BeginUndo();
    2076                 :          0 :         DoChange( true );
    2077                 :          0 :         ShowTable( aBlockRange );
    2078                 :          0 :         EndUndo();
    2079 [ #  # ][ #  # ]:          0 :         SFX_APP()->Broadcast( SfxSimpleHint( SC_HINT_AREALINKS_CHANGED ) );
    2080                 :          0 : }
    2081                 :            : 
    2082                 :          0 : void ScUndoDataForm::Redo()
    2083                 :            : {
    2084                 :          0 :         BeginRedo();
    2085                 :          0 :         ScDocument* pDoc = pDocShell->GetDocument();
    2086                 :          0 :         EnableDrawAdjust( pDoc, false );                                //! include in ScBlockUndo?
    2087                 :          0 :         DoChange( false );
    2088                 :          0 :         EnableDrawAdjust( pDoc, true );                                 //! include in ScBlockUndo?
    2089                 :          0 :         EndRedo();
    2090 [ #  # ][ #  # ]:          0 :         SFX_APP()->Broadcast( SfxSimpleHint( SC_HINT_AREALINKS_CHANGED ) );
    2091                 :          0 : }
    2092                 :            : 
    2093                 :          0 : void ScUndoDataForm::Repeat(SfxRepeatTarget& /*rTarget*/)
    2094                 :            : {
    2095                 :          0 : }
    2096                 :            : 
    2097                 :          0 : sal_Bool ScUndoDataForm::CanRepeat(SfxRepeatTarget& rTarget) const
    2098                 :            : {
    2099                 :          0 :         return (rTarget.ISA(ScTabViewTarget));
    2100                 :            : }
    2101                 :            : 
    2102                 :          0 : void ScUndoDataForm::DoChange( const sal_Bool bUndo )
    2103                 :            : {
    2104                 :          0 :     ScDocument* pDoc = pDocShell->GetDocument();
    2105                 :            : 
    2106                 :            :     //      RefUndoData for redo is created before first undo
    2107                 :            :     //      (with DeleteUnchanged after the DoUndo call)
    2108 [ #  # ][ #  # ]:          0 :     sal_Bool bCreateRedoData = ( bUndo && pRefUndoData && !pRefRedoData );
                 [ #  # ]
    2109         [ #  # ]:          0 :     if ( bCreateRedoData )
    2110 [ #  # ][ #  # ]:          0 :             pRefRedoData = new ScRefUndoData( pDoc );
    2111                 :            : 
    2112         [ #  # ]:          0 :     ScRefUndoData* pWorkRefData = bUndo ? pRefUndoData : pRefRedoData;
    2113                 :            : 
    2114                 :            :     //      fuer Undo immer alle oder keine Inhalte sichern
    2115                 :          0 :     sal_uInt16 nUndoFlags = IDF_NONE;
    2116         [ #  # ]:          0 :     if (nFlags & IDF_CONTENTS)
    2117                 :          0 :             nUndoFlags |= IDF_CONTENTS;
    2118         [ #  # ]:          0 :     if (nFlags & IDF_ATTRIB)
    2119                 :          0 :             nUndoFlags |= IDF_ATTRIB;
    2120                 :            : 
    2121                 :          0 :     sal_Bool bPaintAll = false;
    2122                 :            : 
    2123         [ #  # ]:          0 :     ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
    2124                 :            : 
    2125         [ #  # ]:          0 :     SCTAB nTabCount = pDoc->GetTableCount();
    2126 [ #  # ][ #  # ]:          0 :     if ( bUndo && !bRedoFilled )
    2127                 :            :     {
    2128         [ #  # ]:          0 :         if (!pRedoDoc)
    2129                 :            :         {
    2130 [ #  # ][ #  # ]:          0 :             sal_Bool bColInfo = ( aBlockRange.aStart.Row()==0 && aBlockRange.aEnd.Row()==MAXROW );
    2131 [ #  # ][ #  # ]:          0 :             sal_Bool bRowInfo = ( aBlockRange.aStart.Col()==0 && aBlockRange.aEnd.Col()==MAXCOL );
    2132                 :            : 
    2133 [ #  # ][ #  # ]:          0 :             pRedoDoc = new ScDocument( SCDOCMODE_UNDO );
    2134         [ #  # ]:          0 :             pRedoDoc->InitUndoSelected( pDoc, *mpMarkData, bColInfo, bRowInfo );
    2135                 :            :         }
    2136                 :            :         //  read "redo" data from the document in the first undo
    2137                 :            :             //  all sheets - CopyToDocument skips those that don't exist in pRedoDoc
    2138                 :          0 :         ScRange aCopyRange = aBlockRange;
    2139                 :          0 :         aCopyRange.aStart.SetTab(0);
    2140                 :          0 :         aCopyRange.aEnd.SetTab(nTabCount-1);
    2141         [ #  # ]:          0 :         pDoc->CopyToDocument( aCopyRange, 1, false, pRedoDoc );
    2142                 :          0 :         bRedoFilled = true;
    2143                 :            :     }
    2144                 :            : 
    2145                 :          0 :     sal_uInt16 nExtFlags = 0;
    2146         [ #  # ]:          0 :     pDocShell->UpdatePaintExt( nExtFlags, aBlockRange );
    2147                 :            : 
    2148         [ #  # ]:          0 :     for ( sal_uInt16 i=0; i <= ( aBlockRange.aEnd.Col() - aBlockRange.aStart.Col() ); i++ )
    2149                 :            :     {
    2150         [ #  # ]:          0 :         String aOldString;
    2151         [ #  # ]:          0 :         pUndoDoc->GetString( aBlockRange.aStart.Col()+i , aBlockRange.aStart.Row() , aBlockRange.aStart.Tab() , aOldString );
    2152 [ #  # ][ #  # ]:          0 :         pDoc->SetString( aBlockRange.aStart.Col()+i , aBlockRange.aStart.Row() , aBlockRange.aStart.Tab() , aOldString );
    2153         [ #  # ]:          0 :     }
    2154                 :            : 
    2155         [ #  # ]:          0 :     if (pWorkRefData)
    2156                 :            :     {
    2157         [ #  # ]:          0 :         pWorkRefData->DoUndo( pDoc, true );             // TRUE = bSetChartRangeLists for SetChartListenerCollection
    2158 [ #  # ][ #  # ]:          0 :         if ( pDoc->RefreshAutoFilter( 0,0, MAXCOL,MAXROW, aBlockRange.aStart.Tab() ) )
    2159                 :          0 :             bPaintAll = true;
    2160                 :            :     }
    2161                 :            : 
    2162 [ #  # ][ #  # ]:          0 :     if ( bCreateRedoData && pRefRedoData )
    2163         [ #  # ]:          0 :             pRefRedoData->DeleteUnchanged( pDoc );
    2164                 :            : 
    2165         [ #  # ]:          0 :     if ( bUndo )
    2166                 :            :     {
    2167                 :          0 :         ScChangeTrack* pChangeTrack = pDoc->GetChangeTrack();
    2168         [ #  # ]:          0 :         if ( pChangeTrack )
    2169         [ #  # ]:          0 :             pChangeTrack->Undo( nStartChangeAction, nEndChangeAction );
    2170                 :            :     }
    2171                 :            :     else
    2172         [ #  # ]:          0 :         SetChangeTrack();
    2173                 :            : 
    2174                 :          0 :     ScRange aDrawRange( aBlockRange );
    2175         [ #  # ]:          0 :     pDoc->ExtendMerge( aDrawRange, true );      // only needed for single sheet (text/rtf etc.)
    2176                 :          0 :     sal_uInt16 nPaint = PAINT_GRID;
    2177         [ #  # ]:          0 :     if (bPaintAll)
    2178                 :            :     {
    2179                 :          0 :         aDrawRange.aStart.SetCol(0);
    2180                 :          0 :         aDrawRange.aStart.SetRow(0);
    2181                 :          0 :         aDrawRange.aEnd.SetCol(MAXCOL);
    2182                 :          0 :         aDrawRange.aEnd.SetRow(MAXROW);
    2183                 :          0 :         nPaint |= PAINT_TOP | PAINT_LEFT;
    2184         [ #  # ]:          0 : /*A*/   if (pViewShell)
    2185         [ #  # ]:          0 :             pViewShell->AdjustBlockHeight(false);
    2186                 :            :     }
    2187                 :            :     else
    2188                 :            :     {
    2189 [ #  # ][ #  # ]:          0 :         if ( aBlockRange.aStart.Row() == 0 && aBlockRange.aEnd.Row() == MAXROW )        // ganze Spalte
                 [ #  # ]
    2190                 :            :         {
    2191                 :          0 :             nPaint |= PAINT_TOP;
    2192                 :          0 :             aDrawRange.aEnd.SetCol(MAXCOL);
    2193                 :            :         }
    2194 [ #  # ][ #  # ]:          0 :         if ( aBlockRange.aStart.Col() == 0 && aBlockRange.aEnd.Col() == MAXCOL )        // ganze Zeile
                 [ #  # ]
    2195                 :            :         {
    2196                 :          0 :             nPaint |= PAINT_LEFT;
    2197                 :          0 :             aDrawRange.aEnd.SetRow(MAXROW);
    2198                 :            :         }
    2199 [ #  # ][ #  # ]:          0 : /*A*/   if ((pViewShell) && pViewShell->AdjustBlockHeight(false))
         [ #  # ][ #  # ]
    2200                 :            :         {
    2201                 :          0 :             aDrawRange.aStart.SetCol(0);
    2202                 :          0 :             aDrawRange.aStart.SetRow(0);
    2203                 :          0 :             aDrawRange.aEnd.SetCol(MAXCOL);
    2204                 :          0 :             aDrawRange.aEnd.SetRow(MAXROW);
    2205                 :          0 :             nPaint |= PAINT_LEFT;
    2206                 :            :         }
    2207         [ #  # ]:          0 :         pDocShell->UpdatePaintExt( nExtFlags, aDrawRange );
    2208                 :            :     }
    2209                 :            : 
    2210         [ #  # ]:          0 :     if ( !bUndo )                               //      draw redo after updating row heights
    2211         [ #  # ]:          0 :         RedoSdrUndoAction( pDrawUndo );                 //!     include in ScBlockUndo?
    2212                 :            : 
    2213 [ #  # ][ #  # ]:          0 :     pDocShell->PostPaint( aDrawRange, nPaint, nExtFlags );
                 [ #  # ]
    2214                 :            : 
    2215         [ #  # ]:          0 :     pDocShell->PostDataChanged();
    2216         [ #  # ]:          0 :     if (pViewShell)
    2217         [ #  # ]:          0 :         pViewShell->CellContentChanged();
    2218                 :          0 : }
    2219                 :            : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10