LCOV - code coverage report
Current view: top level - sc/source/ui/docshell - olinefun.cxx (source / functions) Hit Total Coverage
Test: commit c8344322a7af75b84dd3ca8f78b05543a976dfd5 Lines: 320 415 77.1 %
Date: 2015-06-13 12:38:46 Functions: 12 13 92.3 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       2             : /*
       3             :  * This file is part of the LibreOffice project.
       4             :  *
       5             :  * This Source Code Form is subject to the terms of the Mozilla Public
       6             :  * License, v. 2.0. If a copy of the MPL was not distributed with this
       7             :  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
       8             :  *
       9             :  * This file incorporates work covered by the following license notice:
      10             :  *
      11             :  *   Licensed to the Apache Software Foundation (ASF) under one or more
      12             :  *   contributor license agreements. See the NOTICE file distributed
      13             :  *   with this work for additional information regarding copyright
      14             :  *   ownership. The ASF licenses this file to you under the Apache
      15             :  *   License, Version 2.0 (the "License"); you may not use this file
      16             :  *   except in compliance with the License. You may obtain a copy of
      17             :  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
      18             :  */
      19             : 
      20             : #include <sfx2/bindings.hxx>
      21             : 
      22             : #include "olinefun.hxx"
      23             : 
      24             : #include "docsh.hxx"
      25             : #include "olinetab.hxx"
      26             : #include "undodat.hxx"
      27             : #include "globstr.hrc"
      28             : #include "sc.hrc"
      29             : 
      30          61 : static void lcl_InvalidateOutliner( SfxBindings* pBindings )
      31             : {
      32          61 :     if ( pBindings )
      33             :     {
      34          61 :         pBindings->Invalidate( SID_OUTLINE_SHOW );
      35          61 :         pBindings->Invalidate( SID_OUTLINE_HIDE );
      36          61 :         pBindings->Invalidate( SID_OUTLINE_REMOVE );
      37             : 
      38          61 :         pBindings->Invalidate( SID_STATUS_SUM );            // wegen ein-/ausblenden
      39          61 :         pBindings->Invalidate( SID_ATTR_SIZE );
      40             :     }
      41          61 : }
      42             : 
      43             : //! PaintWidthHeight zur DocShell verschieben?
      44             : 
      45           1 : static void lcl_PaintWidthHeight( ScDocShell& rDocShell, SCTAB nTab,
      46             :                                     bool bColumns, SCCOLROW nStart, SCCOLROW nEnd )
      47             : {
      48           1 :     ScDocument& rDoc = rDocShell.GetDocument();
      49             : 
      50           1 :     sal_uInt16 nParts = PAINT_GRID;
      51           1 :     SCCOL nStartCol = 0;
      52           1 :     SCROW nStartRow = 0;
      53           1 :     SCCOL nEndCol = MAXCOL;         // fuer Test auf Merge
      54           1 :     SCROW nEndRow = MAXROW;
      55           1 :     if ( bColumns )
      56             :     {
      57           1 :         nParts |= PAINT_TOP;
      58           1 :         nStartCol = static_cast<SCCOL>(nStart);
      59           1 :         nEndCol = static_cast<SCCOL>(nEnd);
      60             :     }
      61             :     else
      62             :     {
      63           0 :         nParts |= PAINT_LEFT;
      64           0 :         nStartRow = nStart;
      65           0 :         nEndRow = nEnd;
      66             :     }
      67           1 :     if (rDoc.HasAttrib( nStartCol,nStartRow,nTab, nEndCol,nEndRow,nTab,
      68           1 :                             HASATTR_MERGED | HASATTR_OVERLAPPED ))
      69             :     {
      70           0 :         nStartCol = 0;
      71           0 :         nStartRow = 0;
      72             :     }
      73           1 :     rDocShell.PostPaint( nStartCol,nStartRow,nTab, MAXCOL,MAXROW,nTab, nParts );
      74           1 : }
      75             : 
      76           8 : bool ScOutlineDocFunc::MakeOutline( const ScRange& rRange, bool bColumns, bool bRecord, bool bApi )
      77             : {
      78           8 :     bool bSuccess = false;
      79           8 :     SCCOL nStartCol = rRange.aStart.Col();
      80           8 :     SCROW nStartRow = rRange.aStart.Row();
      81           8 :     SCCOL nEndCol = rRange.aEnd.Col();
      82           8 :     SCROW nEndRow = rRange.aEnd.Row();
      83           8 :     SCTAB nTab = rRange.aStart.Tab();
      84             : 
      85           8 :     ScDocument& rDoc = rDocShell.GetDocument();
      86           8 :     ScOutlineTable* pTable = rDoc.GetOutlineTable( nTab, true );
      87           8 :     ScOutlineTable* pUndoTab = NULL;
      88             : 
      89           8 :     if (bRecord && !rDoc.IsUndoEnabled())
      90           0 :         bRecord = false;
      91             : 
      92           8 :     if (bRecord)
      93           8 :         pUndoTab = new ScOutlineTable( *pTable );
      94             : 
      95           8 :     ScOutlineArray& rArray = bColumns ? pTable->GetColArray() : pTable->GetRowArray();
      96             : 
      97             :     bool bRes;
      98           8 :     bool bSize = false;
      99           8 :     if ( bColumns )
     100           2 :         bRes = rArray.Insert( nStartCol, nEndCol, bSize );
     101             :     else
     102           6 :         bRes = rArray.Insert( nStartRow, nEndRow, bSize );
     103             : 
     104           8 :     if ( bRes )
     105             :     {
     106           8 :         if (bRecord)
     107             :         {
     108           8 :             rDocShell.GetUndoManager()->AddUndoAction(
     109             :                 new ScUndoMakeOutline( &rDocShell,
     110             :                                         nStartCol,nStartRow,nTab,nEndCol,nEndRow,nTab,
     111           8 :                                         pUndoTab, bColumns, true ) );
     112             :         }
     113             : 
     114           8 :         if (rDoc.IsStreamValid(nTab))
     115           0 :             rDoc.SetStreamValid(nTab, false);
     116             : 
     117           8 :         sal_uInt16 nParts = 0;              // Datenbereich nicht geaendert
     118           8 :         if ( bColumns )
     119           2 :             nParts |= PAINT_TOP;
     120             :         else
     121           6 :             nParts |= PAINT_LEFT;
     122           8 :         if ( bSize )
     123           4 :             nParts |= PAINT_SIZE;
     124             : 
     125           8 :         rDocShell.PostPaint( 0,0,nTab, MAXCOL,MAXROW,nTab, nParts );
     126           8 :         rDocShell.SetDocumentModified();
     127           8 :         lcl_InvalidateOutliner( rDocShell.GetViewBindings() );
     128           8 :         bSuccess = true;
     129             :     }
     130             :     else
     131             :     {
     132           0 :         if (!bApi)
     133           0 :             rDocShell.ErrorMessage(STR_MSSG_MAKEOUTLINE_0); // "Gruppierung nicht moeglich"
     134           0 :         delete pUndoTab;
     135             :     }
     136             : 
     137           8 :     return bSuccess;
     138             : }
     139             : 
     140           4 : bool ScOutlineDocFunc::RemoveOutline( const ScRange& rRange, bool bColumns, bool bRecord, bool bApi )
     141             : {
     142           4 :     bool bDone = false;
     143             : 
     144           4 :     SCCOL nStartCol = rRange.aStart.Col();
     145           4 :     SCROW nStartRow = rRange.aStart.Row();
     146           4 :     SCCOL nEndCol = rRange.aEnd.Col();
     147           4 :     SCROW nEndRow = rRange.aEnd.Row();
     148           4 :     SCTAB nTab = rRange.aStart.Tab();
     149             : 
     150           4 :     ScDocument& rDoc = rDocShell.GetDocument();
     151             : 
     152           4 :     if (bRecord && !rDoc.IsUndoEnabled())
     153           0 :         bRecord = false;
     154           4 :     ScOutlineTable* pTable = rDoc.GetOutlineTable( nTab );
     155           4 :     if (pTable)
     156             :     {
     157           4 :         ScOutlineTable* pUndoTab = NULL;
     158           4 :         if (bRecord)
     159           4 :             pUndoTab = new ScOutlineTable( *pTable );
     160             : 
     161           4 :         ScOutlineArray& rArray = bColumns ? pTable->GetColArray() : pTable->GetRowArray();
     162             : 
     163             :         bool bRes;
     164           4 :         bool bSize = false;
     165           4 :         if ( bColumns )
     166           1 :             bRes = rArray.Remove( nStartCol, nEndCol, bSize );
     167             :         else
     168           3 :             bRes = rArray.Remove( nStartRow, nEndRow, bSize );
     169             : 
     170           4 :         if ( bRes )
     171             :         {
     172           4 :             if (bRecord)
     173             :             {
     174           4 :                 rDocShell.GetUndoManager()->AddUndoAction(
     175             :                     new ScUndoMakeOutline( &rDocShell,
     176             :                                             nStartCol,nStartRow,nTab, nEndCol,nEndRow,nTab,
     177           4 :                                             pUndoTab, bColumns, false ) );
     178             :             }
     179             : 
     180           4 :             if (rDoc.IsStreamValid(nTab))
     181           0 :                 rDoc.SetStreamValid(nTab, false);
     182             : 
     183           4 :             sal_uInt16 nParts = 0;              // Datenbereich nicht geaendert
     184           4 :             if ( bColumns )
     185           1 :                 nParts |= PAINT_TOP;
     186             :             else
     187           3 :                 nParts |= PAINT_LEFT;
     188           4 :             if ( bSize )
     189           2 :                 nParts |= PAINT_SIZE;
     190             : 
     191           4 :             rDocShell.PostPaint( 0,0,nTab, MAXCOL,MAXROW,nTab, nParts );
     192           4 :             rDocShell.SetDocumentModified();
     193           4 :             bDone = true;
     194           4 :             lcl_InvalidateOutliner( rDocShell.GetViewBindings() );
     195             : 
     196             :             // es wird nicht wieder eingeblendet -> kein UpdatePageBreaks
     197             :         }
     198             :         else
     199           0 :             delete pUndoTab;
     200             :     }
     201             : 
     202           4 :     if (!bDone && !bApi)
     203           0 :         rDocShell.ErrorMessage(STR_MSSG_REMOVEOUTLINE_0);   // "Aufheben nicht moeglich"
     204             : 
     205           4 :     return bDone;
     206             : }
     207             : 
     208           7 : bool ScOutlineDocFunc::RemoveAllOutlines( SCTAB nTab, bool bRecord )
     209             : {
     210           7 :     bool bSuccess = false;
     211           7 :     ScDocument& rDoc = rDocShell.GetDocument();
     212             : 
     213           7 :     if (bRecord && !rDoc.IsUndoEnabled())
     214           0 :         bRecord = false;
     215           7 :     ScOutlineTable* pTable = rDoc.GetOutlineTable( nTab );
     216           7 :     if (pTable)
     217             :     {
     218           4 :         if (bRecord)
     219             :         {
     220             :             SCCOLROW nCol1, nCol2, nRow1, nRow2;
     221           4 :             pTable->GetColArray().GetRange( nCol1, nCol2 );
     222           4 :             pTable->GetRowArray().GetRange( nRow1, nRow2 );
     223           4 :             SCCOL nStartCol = static_cast<SCCOL>(nCol1);
     224           4 :             SCROW nStartRow = nRow1;
     225           4 :             SCCOL nEndCol = static_cast<SCCOL>(nCol2);
     226           4 :             SCROW nEndRow = nRow2;
     227             : 
     228           4 :             ScDocument* pUndoDoc = new ScDocument( SCDOCMODE_UNDO );
     229           4 :             pUndoDoc->InitUndo( &rDoc, nTab, nTab, true, true );
     230           4 :             rDoc.CopyToDocument( nStartCol, 0, nTab, nEndCol, MAXROW, nTab, IDF_NONE, false, pUndoDoc );
     231           4 :             rDoc.CopyToDocument( 0, nStartRow, nTab, MAXCOL, nEndRow, nTab, IDF_NONE, false, pUndoDoc );
     232             : 
     233           4 :             ScOutlineTable* pUndoTab = new ScOutlineTable( *pTable );
     234             : 
     235           4 :             rDocShell.GetUndoManager()->AddUndoAction(
     236             :                 new ScUndoRemoveAllOutlines( &rDocShell,
     237             :                                                 nStartCol, nStartRow, nTab,
     238             :                                                 nEndCol, nEndRow, nTab,
     239           4 :                                                 pUndoDoc, pUndoTab ) );
     240             :         }
     241             : 
     242           4 :         SelectLevel( nTab, true,  pTable->GetColArray().GetDepth(), false, false );
     243           4 :         SelectLevel( nTab, false, pTable->GetRowArray().GetDepth(), false, false );
     244           4 :         rDoc.SetOutlineTable( nTab, NULL );
     245             : 
     246           4 :         rDoc.UpdatePageBreaks( nTab );
     247             : 
     248           4 :         if (rDoc.IsStreamValid(nTab))
     249           0 :             rDoc.SetStreamValid(nTab, false);
     250             : 
     251             :         rDocShell.PostPaint( 0,0,nTab, MAXCOL,MAXROW,nTab,
     252           4 :                                     PAINT_GRID | PAINT_LEFT | PAINT_TOP | PAINT_SIZE );
     253           4 :         rDocShell.SetDocumentModified();
     254           4 :         lcl_InvalidateOutliner( rDocShell.GetViewBindings() );
     255           4 :         bSuccess = true;
     256             :     }
     257             : 
     258           7 :     return bSuccess;
     259             : }
     260             : 
     261           1 : bool ScOutlineDocFunc::AutoOutline( const ScRange& rRange, bool bRecord )
     262             : {
     263           1 :     SCCOL nStartCol = rRange.aStart.Col();
     264           1 :     SCROW nStartRow = rRange.aStart.Row();
     265           1 :     SCCOL nEndCol = rRange.aEnd.Col();
     266           1 :     SCROW nEndRow = rRange.aEnd.Row();
     267           1 :     SCTAB nTab = rRange.aStart.Tab();
     268             : 
     269           1 :     ScDocument& rDoc = rDocShell.GetDocument();
     270             : 
     271           1 :     if (bRecord && !rDoc.IsUndoEnabled())
     272           0 :         bRecord = false;
     273           1 :     ScOutlineTable* pTable = rDoc.GetOutlineTable( nTab );
     274             : 
     275           1 :     ScDocument* pUndoDoc = NULL;
     276           1 :     ScOutlineTable* pUndoTab = NULL;
     277             : 
     278           1 :     if ( pTable )
     279             :     {
     280           0 :         if ( bRecord )
     281             :         {
     282           0 :             pUndoTab = new ScOutlineTable( *pTable );
     283             : 
     284             :             SCCOLROW nCol1, nCol2, nRow1, nRow2;
     285           0 :             pTable->GetColArray().GetRange( nCol1, nCol2 );
     286           0 :             pTable->GetRowArray().GetRange( nRow1, nRow2 );
     287           0 :             SCCOL nOutStartCol = static_cast<SCCOL>(nCol1);
     288           0 :             SCROW nOutStartRow = nRow1;
     289           0 :             SCCOL nOutEndCol = static_cast<SCCOL>(nCol2);
     290           0 :             SCROW nOutEndRow = nRow2;
     291             : 
     292           0 :             pUndoDoc = new ScDocument( SCDOCMODE_UNDO );
     293           0 :             pUndoDoc->InitUndo( &rDoc, nTab, nTab, true, true );
     294           0 :             rDoc.CopyToDocument( nOutStartCol, 0, nTab, nOutEndCol, MAXROW, nTab, IDF_NONE, false, pUndoDoc );
     295           0 :             rDoc.CopyToDocument( 0, nOutStartRow, nTab, MAXCOL, nOutEndRow, nTab, IDF_NONE, false, pUndoDoc );
     296             :         }
     297             : 
     298             :         // einblenden
     299           0 :         SelectLevel( nTab, true,  pTable->GetColArray().GetDepth(), false, false );
     300           0 :         SelectLevel( nTab, false, pTable->GetRowArray().GetDepth(), false, false );
     301           0 :         rDoc.SetOutlineTable( nTab, NULL );
     302             :     }
     303             : 
     304           1 :     rDoc.DoAutoOutline( nStartCol,nStartRow, nEndCol,nEndRow, nTab );
     305             : 
     306           1 :     if (bRecord)
     307             :     {
     308           1 :         rDocShell.GetUndoManager()->AddUndoAction(
     309             :             new ScUndoAutoOutline( &rDocShell,
     310             :                                     nStartCol, nStartRow, nTab,
     311             :                                     nEndCol, nEndRow, nTab,
     312           1 :                                     pUndoDoc, pUndoTab ) );
     313             :     }
     314             : 
     315           1 :     if (rDoc.IsStreamValid(nTab))
     316           0 :         rDoc.SetStreamValid(nTab, false);
     317             : 
     318           1 :     rDocShell.PostPaint( 0,0,nTab, MAXCOL,MAXROW,nTab, PAINT_LEFT | PAINT_TOP | PAINT_SIZE );
     319           1 :     rDocShell.SetDocumentModified();
     320           1 :     lcl_InvalidateOutliner( rDocShell.GetViewBindings() );
     321             : 
     322           1 :     return true;
     323             : }
     324             : 
     325           9 : bool ScOutlineDocFunc::SelectLevel( SCTAB nTab, bool bColumns, sal_uInt16 nLevel,
     326             :                                     bool bRecord, bool bPaint )
     327             : {
     328           9 :     ScDocument& rDoc = rDocShell.GetDocument();
     329             : 
     330           9 :     if (bRecord && !rDoc.IsUndoEnabled())
     331           0 :         bRecord = false;
     332           9 :     ScOutlineTable* pTable = rDoc.GetOutlineTable( nTab );             // ist schon da
     333           9 :     if (!pTable)
     334           0 :         return false;
     335           9 :     ScOutlineArray& rArray = bColumns ? pTable->GetColArray() : pTable->GetRowArray();
     336             : 
     337             :     SCCOLROW nStart, nEnd;
     338           9 :     rArray.GetRange( nStart, nEnd );
     339             : 
     340           9 :     if ( bRecord )
     341             :     {
     342           1 :         ScOutlineTable* pUndoTab = new ScOutlineTable( *pTable );
     343           1 :         ScDocument* pUndoDoc = new ScDocument( SCDOCMODE_UNDO );
     344           1 :         if (bColumns)
     345             :         {
     346           1 :             pUndoDoc->InitUndo( &rDoc, nTab, nTab, true, false );
     347             :             rDoc.CopyToDocument( static_cast<SCCOL>(nStart), 0, nTab,
     348             :                     static_cast<SCCOL>(nEnd), MAXROW, nTab, IDF_NONE, false,
     349           1 :                     pUndoDoc );
     350             :         }
     351             :         else
     352             :         {
     353           0 :             pUndoDoc->InitUndo( &rDoc, nTab, nTab, false, true );
     354           0 :             rDoc.CopyToDocument( 0, nStart, nTab, MAXCOL, nEnd, nTab, IDF_NONE, false, pUndoDoc );
     355             :         }
     356             : 
     357           1 :         rDocShell.GetUndoManager()->AddUndoAction(
     358             :             new ScUndoOutlineLevel( &rDocShell,
     359             :                                     nStart, nEnd, nTab,             //! start und end berechnen
     360             :                                     pUndoDoc, pUndoTab,
     361           1 :                                     bColumns, nLevel ) );
     362             :     }
     363             : 
     364           9 :     ScSubOutlineIterator aIter( &rArray );                   // alle Eintraege
     365             :     ScOutlineEntry* pEntry;
     366          36 :     while ((pEntry=aIter.GetNext()) != NULL)
     367             :     {
     368          18 :         sal_uInt16 nThisLevel = aIter.LastLevel();
     369          18 :         bool bShow = (nThisLevel < nLevel);
     370          18 :         if (bShow)                                          // einblenden
     371             :         {
     372          16 :             pEntry->SetHidden( false );
     373          16 :             pEntry->SetVisible( true );
     374             :         }
     375           2 :         else if ( nThisLevel == nLevel )                    // ausblenden
     376             :         {
     377           1 :             pEntry->SetHidden( true );
     378           1 :             pEntry->SetVisible( true );
     379             :         }
     380             :         else                                                // verdeckt
     381             :         {
     382           1 :             pEntry->SetVisible( false );
     383             :         }
     384             : 
     385          18 :         SCCOLROW nThisStart = pEntry->GetStart();
     386          18 :         SCCOLROW nThisEnd   = pEntry->GetEnd();
     387         187 :         for (SCCOLROW i=nThisStart; i<=nThisEnd; i++)
     388             :         {
     389         169 :             if ( bColumns )
     390         160 :                 rDoc.ShowCol( static_cast<SCCOL>(i), nTab, bShow );
     391             :             else
     392             :             {
     393             :                 // show several rows together, don't show filtered rows
     394           9 :                 SCROW nFilterEnd = i;
     395           9 :                 bool bFiltered = rDoc.RowFiltered( i, nTab, NULL, &nFilterEnd );
     396           9 :                 nFilterEnd = std::min( nThisEnd, nFilterEnd );
     397           9 :                 if ( !bShow || !bFiltered )
     398           9 :                     rDoc.ShowRows( i, nFilterEnd, nTab, bShow );
     399           9 :                 i = nFilterEnd;
     400             :             }
     401             :         }
     402             :     }
     403             : 
     404           9 :     rDoc.SetDrawPageSize(nTab);
     405           9 :     rDoc.UpdatePageBreaks( nTab );
     406             : 
     407           9 :     if (bPaint)
     408           1 :         lcl_PaintWidthHeight( rDocShell, nTab, bColumns, nStart, nEnd );
     409             : 
     410           9 :     rDocShell.SetDocumentModified();
     411           9 :     lcl_InvalidateOutliner( rDocShell.GetViewBindings() );
     412             : 
     413           9 :     return true;
     414             : }
     415             : 
     416          10 : bool ScOutlineDocFunc::ShowMarkedOutlines( const ScRange& rRange, bool bRecord )
     417             : {
     418          10 :     bool bDone = false;
     419             : 
     420          10 :     SCCOL nStartCol = rRange.aStart.Col();
     421          10 :     SCROW nStartRow = rRange.aStart.Row();
     422          10 :     SCCOL nEndCol = rRange.aEnd.Col();
     423          10 :     SCROW nEndRow = rRange.aEnd.Row();
     424          10 :     SCTAB nTab = rRange.aStart.Tab();
     425             : 
     426          10 :     ScDocument& rDoc = rDocShell.GetDocument();
     427             : 
     428          10 :     if (bRecord && !rDoc.IsUndoEnabled())
     429           0 :         bRecord = false;
     430          10 :     ScOutlineTable* pTable = rDoc.GetOutlineTable( nTab );
     431             : 
     432          10 :     if (pTable)
     433             :     {
     434             :         ScOutlineEntry* pEntry;
     435             :         SCCOLROW nStart;
     436             :         SCCOLROW nEnd;
     437             :         SCCOLROW nMin;
     438             :         SCCOLROW nMax;
     439             :         SCCOLROW i;
     440             : 
     441          10 :         if ( bRecord )
     442             :         {
     443          10 :             ScOutlineTable* pUndoTab = new ScOutlineTable( *pTable );
     444          10 :             ScDocument* pUndoDoc = new ScDocument( SCDOCMODE_UNDO );
     445          10 :             pUndoDoc->InitUndo( &rDoc, nTab, nTab, true, true );
     446          10 :             rDoc.CopyToDocument( nStartCol, 0, nTab, nEndCol, MAXROW, nTab, IDF_NONE, false, pUndoDoc );
     447          10 :             rDoc.CopyToDocument( 0, nStartRow, nTab, MAXCOL, nEndRow, nTab, IDF_NONE, false, pUndoDoc );
     448             : 
     449          10 :             rDocShell.GetUndoManager()->AddUndoAction(
     450             :                 new ScUndoOutlineBlock( &rDocShell,
     451             :                                         nStartCol, nStartRow, nTab, nEndCol, nEndRow, nTab,
     452          10 :                                         pUndoDoc, pUndoTab, true ) );
     453             :         }
     454             : 
     455             :         //  Spalten
     456             : 
     457          10 :         nMin=MAXCOL;
     458          10 :         nMax=0;
     459          10 :         ScOutlineArray& rColArray = pTable->GetColArray();
     460          10 :         ScSubOutlineIterator aColIter( &rColArray );
     461          56 :         while ((pEntry=aColIter.GetNext()) != NULL)
     462             :         {
     463          36 :             nStart = pEntry->GetStart();
     464          36 :             nEnd   = pEntry->GetEnd();
     465          36 :             if ( nStart>=nStartCol && nEnd<=nEndCol )
     466             :             {
     467          14 :                 pEntry->SetHidden( false );
     468          14 :                 pEntry->SetVisible( true );
     469          14 :                 if (nStart<nMin) nMin=nStart;
     470          14 :                 if (nEnd>nMax) nMax=nEnd;
     471             :             }
     472             :         }
     473         104 :         for ( i=nMin; i<=nMax; i++ )
     474          94 :             rDoc.ShowCol( static_cast<SCCOL>(i), nTab, true );
     475             : 
     476             :         //  Zeilen
     477             : 
     478          10 :         nMin=MAXROW;
     479          10 :         nMax=0;
     480          10 :         ScOutlineArray& rRowArray = pTable->GetRowArray();
     481          10 :         ScSubOutlineIterator aRowIter( &rRowArray );
     482          59 :         while ((pEntry=aRowIter.GetNext()) != NULL)
     483             :         {
     484          39 :             nStart = pEntry->GetStart();
     485          39 :             nEnd   = pEntry->GetEnd();
     486          39 :             if ( nStart>=nStartRow && nEnd<=nEndRow )
     487             :             {
     488          14 :                 pEntry->SetHidden( false );
     489          14 :                 pEntry->SetVisible( true );
     490          14 :                 if (nStart<nMin) nMin=nStart;
     491          14 :                 if (nEnd>nMax) nMax=nEnd;
     492             :             }
     493             :         }
     494          14 :         for ( i=nMin; i<=nMax; i++ )
     495             :         {
     496             :             // show several rows together, don't show filtered rows
     497           4 :             SCROW nFilterEnd = i;
     498           4 :             bool bFiltered = rDoc.RowFiltered( i, nTab, NULL, &nFilterEnd );
     499           4 :             nFilterEnd = std::min( nMax, nFilterEnd );
     500           4 :             if ( !bFiltered )
     501           4 :                 rDoc.ShowRows( i, nFilterEnd, nTab, true );
     502           4 :             i = nFilterEnd;
     503             :         }
     504             : 
     505          10 :         rDoc.SetDrawPageSize(nTab);
     506          10 :         rDoc.UpdatePageBreaks( nTab );
     507             : 
     508          10 :         rDocShell.PostPaint( 0,0,nTab, MAXCOL,MAXROW,nTab, PAINT_GRID | PAINT_LEFT | PAINT_TOP );
     509          10 :         rDocShell.SetDocumentModified();
     510          10 :         bDone = true;
     511             : 
     512          10 :         lcl_InvalidateOutliner( rDocShell.GetViewBindings() );
     513             :     }
     514             : 
     515          10 :     return bDone;
     516             : }
     517             : 
     518          13 : bool ScOutlineDocFunc::HideMarkedOutlines( const ScRange& rRange, bool bRecord )
     519             : {
     520          13 :     bool bDone = false;
     521             : 
     522          13 :     SCCOL nStartCol = rRange.aStart.Col();
     523          13 :     SCROW nStartRow = rRange.aStart.Row();
     524          13 :     SCCOL nEndCol = rRange.aEnd.Col();
     525          13 :     SCROW nEndRow = rRange.aEnd.Row();
     526          13 :     SCTAB nTab = rRange.aStart.Tab();
     527             : 
     528          13 :     ScDocument& rDoc = rDocShell.GetDocument();
     529             : 
     530          13 :     if (bRecord && !rDoc.IsUndoEnabled())
     531           0 :         bRecord = false;
     532          13 :     ScOutlineTable* pTable = rDoc.GetOutlineTable( nTab );
     533             : 
     534          13 :     if (pTable)
     535             :     {
     536             :         const ScOutlineEntry* pEntry;
     537             :         size_t nColLevel;
     538             :         size_t nRowLevel;
     539             :         sal_uInt16 nCount;
     540             :         SCCOLROW nStart;
     541             :         SCCOLROW nEnd;
     542             :         sal_uInt16 i;
     543             : 
     544          11 :         SCCOLROW nEffStartCol = nStartCol;
     545          11 :         SCCOLROW nEffEndCol   = nEndCol;
     546          11 :         ScOutlineArray& rColArray = pTable->GetColArray();
     547          11 :         rColArray.FindTouchedLevel( nStartCol, nEndCol, nColLevel );
     548          11 :         rColArray.ExtendBlock( nColLevel, nEffStartCol, nEffEndCol );
     549          11 :         SCCOLROW nEffStartRow = nStartRow;
     550          11 :         SCCOLROW nEffEndRow   = nEndRow;
     551          11 :         ScOutlineArray& rRowArray = pTable->GetRowArray();
     552          11 :         rRowArray.FindTouchedLevel( nStartRow, nEndRow, nRowLevel );
     553          11 :         rRowArray.ExtendBlock( nRowLevel, nEffStartRow, nEffEndRow );
     554             : 
     555          11 :         if ( bRecord )
     556             :         {
     557          11 :             ScOutlineTable* pUndoTab = new ScOutlineTable( *pTable );
     558          11 :             ScDocument* pUndoDoc = new ScDocument( SCDOCMODE_UNDO );
     559          11 :             pUndoDoc->InitUndo( &rDoc, nTab, nTab, true, true );
     560             :             rDoc.CopyToDocument( static_cast<SCCOL>(nEffStartCol), 0, nTab,
     561             :                     static_cast<SCCOL>(nEffEndCol), MAXROW, nTab, IDF_NONE,
     562          11 :                     false, pUndoDoc );
     563          11 :             rDoc.CopyToDocument( 0, nEffStartRow, nTab, MAXCOL, nEffEndRow, nTab, IDF_NONE, false, pUndoDoc );
     564             : 
     565          11 :             rDocShell.GetUndoManager()->AddUndoAction(
     566             :                 new ScUndoOutlineBlock( &rDocShell,
     567             :                                         nStartCol, nStartRow, nTab, nEndCol, nEndRow, nTab,
     568          11 :                                         pUndoDoc, pUndoTab, false ) );
     569             :         }
     570             : 
     571             :         //  Spalten
     572             : 
     573          11 :         nCount = rColArray.GetCount(nColLevel);
     574          24 :         for ( i=0; i<nCount; i++ )
     575             :         {
     576          13 :             pEntry = rColArray.GetEntry(nColLevel,i);
     577          13 :             nStart = pEntry->GetStart();
     578          13 :             nEnd   = pEntry->GetEnd();
     579             : 
     580          13 :             if ( static_cast<SCCOLROW>(nStartCol)<=nEnd && static_cast<SCCOLROW>(nEndCol)>=nStart )
     581          10 :                 HideOutline( nTab, true, nColLevel, i, false, false );
     582             :         }
     583             : 
     584             :         //  Zeilen
     585             : 
     586          11 :         nCount = rRowArray.GetCount(nRowLevel);
     587          24 :         for ( i=0; i<nCount; i++ )
     588             :         {
     589          13 :             pEntry = rRowArray.GetEntry(nRowLevel,i);
     590          13 :             nStart = pEntry->GetStart();
     591          13 :             nEnd   = pEntry->GetEnd();
     592             : 
     593          13 :             if ( nStartRow<=nEnd && nEndRow>=nStart )
     594           4 :                 HideOutline( nTab, false, nRowLevel, i, false, false );
     595             :         }
     596             : 
     597          11 :         rDoc.SetDrawPageSize(nTab);
     598          11 :         rDoc.UpdatePageBreaks( nTab );
     599             : 
     600          11 :         rDocShell.PostPaint( 0,0,nTab, MAXCOL,MAXROW,nTab, PAINT_GRID | PAINT_LEFT | PAINT_TOP );
     601             : 
     602          11 :         rDocShell.SetDocumentModified();
     603          11 :         bDone = true;
     604             : 
     605          11 :         lcl_InvalidateOutliner( rDocShell.GetViewBindings() );
     606             :     }
     607             : 
     608          13 :     return bDone;
     609             : }
     610             : 
     611           0 : bool ScOutlineDocFunc::ShowOutline( SCTAB nTab, bool bColumns, sal_uInt16 nLevel, sal_uInt16 nEntry,
     612             :                                     bool bRecord, bool bPaint )
     613             : {
     614           0 :     ScDocument& rDoc = rDocShell.GetDocument();
     615           0 :     if (bRecord && !rDoc.IsUndoEnabled())
     616           0 :         bRecord = false;
     617             : 
     618           0 :     ScOutlineTable* pTable = rDoc.GetOutlineTable( nTab );
     619           0 :     ScOutlineArray& rArray = bColumns ? pTable->GetColArray() : pTable->GetRowArray();
     620           0 :     ScOutlineEntry* pEntry = rArray.GetEntry( nLevel, nEntry );
     621           0 :     SCCOLROW nStart = pEntry->GetStart();
     622           0 :     SCCOLROW nEnd   = pEntry->GetEnd();
     623             : 
     624           0 :     if ( bRecord )
     625             :     {
     626           0 :         ScDocument* pUndoDoc = new ScDocument( SCDOCMODE_UNDO );
     627           0 :         if (bColumns)
     628             :         {
     629           0 :             pUndoDoc->InitUndo( &rDoc, nTab, nTab, true, false );
     630             :             rDoc.CopyToDocument( static_cast<SCCOL>(nStart), 0, nTab,
     631             :                     static_cast<SCCOL>(nEnd), MAXROW, nTab, IDF_NONE, false,
     632           0 :                     pUndoDoc );
     633             :         }
     634             :         else
     635             :         {
     636           0 :             pUndoDoc->InitUndo( &rDoc, nTab, nTab, false, true );
     637           0 :             rDoc.CopyToDocument( 0, nStart, nTab, MAXCOL, nEnd, nTab, IDF_NONE, false, pUndoDoc );
     638             :         }
     639             : 
     640           0 :         rDocShell.GetUndoManager()->AddUndoAction(
     641             :             new ScUndoDoOutline( &rDocShell,
     642             :                                     nStart, nEnd, nTab, pUndoDoc,       //! start und end berechnen
     643           0 :                                     bColumns, nLevel, nEntry, true ) );
     644             :     }
     645             : 
     646           0 :     pEntry->SetHidden(false);
     647             :     SCCOLROW i;
     648           0 :     for ( i = nStart; i <= nEnd; i++ )
     649             :     {
     650           0 :         if ( bColumns )
     651           0 :             rDoc.ShowCol( static_cast<SCCOL>(i), nTab, true );
     652             :         else
     653             :         {
     654             :             // show several rows together, don't show filtered rows
     655           0 :             SCROW nFilterEnd = i;
     656           0 :             bool bFiltered = rDoc.RowFiltered( i, nTab, NULL, &nFilterEnd );
     657           0 :             nFilterEnd = std::min( nEnd, nFilterEnd );
     658           0 :             if ( !bFiltered )
     659           0 :                 rDoc.ShowRows( i, nFilterEnd, nTab, true );
     660           0 :             i = nFilterEnd;
     661             :         }
     662             :     }
     663             : 
     664           0 :     ScSubOutlineIterator aIter( &rArray, nLevel, nEntry );
     665           0 :     while ((pEntry=aIter.GetNext()) != NULL)
     666             :     {
     667           0 :         if ( pEntry->IsHidden() )
     668             :         {
     669           0 :             SCCOLROW nSubStart = pEntry->GetStart();
     670           0 :             SCCOLROW nSubEnd   = pEntry->GetEnd();
     671           0 :             if ( bColumns )
     672           0 :                 for ( i = nSubStart; i <= nSubEnd; i++ )
     673           0 :                     rDoc.ShowCol( static_cast<SCCOL>(i), nTab, false );
     674             :             else
     675           0 :                 rDoc.ShowRows( nSubStart, nSubEnd, nTab, false );
     676             :         }
     677             :     }
     678             : 
     679           0 :     rArray.SetVisibleBelow( nLevel, nEntry, true, true );
     680             : 
     681           0 :     rDoc.SetDrawPageSize(nTab);
     682           0 :     rDoc.InvalidatePageBreaks(nTab);
     683           0 :     rDoc.UpdatePageBreaks( nTab );
     684             : 
     685           0 :     if (bPaint)
     686           0 :         lcl_PaintWidthHeight( rDocShell, nTab, bColumns, nStart, nEnd );
     687             : 
     688           0 :     rDocShell.SetDocumentModified();
     689             : 
     690           0 :     lcl_InvalidateOutliner( rDocShell.GetViewBindings() );
     691             : 
     692           0 :     return true;        //! immer ???
     693             : }
     694             : 
     695          14 : bool ScOutlineDocFunc::HideOutline( SCTAB nTab, bool bColumns, sal_uInt16 nLevel, sal_uInt16 nEntry,
     696             :                                     bool bRecord, bool bPaint )
     697             : {
     698          14 :     ScDocument& rDoc = rDocShell.GetDocument();
     699          14 :     if (bRecord && !rDoc.IsUndoEnabled())
     700           0 :         bRecord = false;
     701             : 
     702          14 :     ScOutlineTable* pTable = rDoc.GetOutlineTable( nTab );
     703          14 :     ScOutlineArray& rArray = bColumns ? pTable->GetColArray() : pTable->GetRowArray();
     704          14 :     ScOutlineEntry* pEntry = rArray.GetEntry( nLevel, nEntry );
     705          14 :     SCCOLROW nStart = pEntry->GetStart();
     706          14 :     SCCOLROW nEnd   = pEntry->GetEnd();
     707             : 
     708          14 :     if ( bRecord )
     709             :     {
     710           0 :         ScDocument* pUndoDoc = new ScDocument( SCDOCMODE_UNDO );
     711           0 :         if (bColumns)
     712             :         {
     713           0 :             pUndoDoc->InitUndo( &rDoc, nTab, nTab, true, false );
     714             :             rDoc.CopyToDocument( static_cast<SCCOL>(nStart), 0, nTab,
     715             :                     static_cast<SCCOL>(nEnd), MAXROW, nTab, IDF_NONE, false,
     716           0 :                     pUndoDoc );
     717             :         }
     718             :         else
     719             :         {
     720           0 :             pUndoDoc->InitUndo( &rDoc, nTab, nTab, false, true );
     721           0 :             rDoc.CopyToDocument( 0, nStart, nTab, MAXCOL, nEnd, nTab, IDF_NONE, false, pUndoDoc );
     722             :         }
     723             : 
     724           0 :         rDocShell.GetUndoManager()->AddUndoAction(
     725             :             new ScUndoDoOutline( &rDocShell,
     726             :                                     nStart, nEnd, nTab, pUndoDoc,
     727           0 :                                     bColumns, nLevel, nEntry, false ) );
     728             :     }
     729             : 
     730          14 :     pEntry->SetHidden(true);
     731             :     SCCOLROW i;
     732          14 :     if ( bColumns )
     733         198 :         for ( i = nStart; i <= nEnd; i++ )
     734         188 :             rDoc.ShowCol( static_cast<SCCOL>(i), nTab, false );
     735             :     else
     736           4 :         rDoc.ShowRows( nStart, nEnd, nTab, false );
     737             : 
     738          14 :     rArray.SetVisibleBelow( nLevel, nEntry, false );
     739             : 
     740          14 :     rDoc.SetDrawPageSize(nTab);
     741          14 :     rDoc.InvalidatePageBreaks(nTab);
     742          14 :     rDoc.UpdatePageBreaks( nTab );
     743             : 
     744          14 :     if (bPaint)
     745           0 :         lcl_PaintWidthHeight( rDocShell, nTab, bColumns, nStart, nEnd );
     746             : 
     747          14 :     rDocShell.SetDocumentModified();
     748             : 
     749          14 :     lcl_InvalidateOutliner( rDocShell.GetViewBindings() );
     750             : 
     751          14 :     return true;        //! immer ???
     752         156 : }
     753             : 
     754             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.11