LCOV - code coverage report
Current view: top level - sc/source/core/data - documen9.cxx (source / functions) Hit Total Coverage
Test: commit 10e77ab3ff6f4314137acd6e2702a6e5c1ce1fae Lines: 244 342 71.3 %
Date: 2014-11-03 Functions: 35 40 87.5 %
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 "scitems.hxx"
      21             : #include <editeng/eeitem.hxx>
      22             : 
      23             : #include <sot/exchange.hxx>
      24             : #include <editeng/autokernitem.hxx>
      25             : #include <editeng/fontitem.hxx>
      26             : #include <editeng/forbiddencharacterstable.hxx>
      27             : #include <editeng/langitem.hxx>
      28             : #include <osl/thread.h>
      29             : #include <svx/svdetc.hxx>
      30             : #include <svx/svditer.hxx>
      31             : #include <svx/svdocapt.hxx>
      32             : #include <svx/svdograf.hxx>
      33             : #include <svx/svdoole2.hxx>
      34             : #include <svx/svdouno.hxx>
      35             : #include <svx/svdpage.hxx>
      36             : #include <svx/svdundo.hxx>
      37             : #include <svx/xtable.hxx>
      38             : #include <sfx2/objsh.hxx>
      39             : #include <sfx2/printer.hxx>
      40             : #include <unotools/saveopt.hxx>
      41             : #include <unotools/pathoptions.hxx>
      42             : 
      43             : #include "document.hxx"
      44             : #include "docoptio.hxx"
      45             : #include "table.hxx"
      46             : #include "drwlayer.hxx"
      47             : #include "markdata.hxx"
      48             : #include "patattr.hxx"
      49             : #include "rechead.hxx"
      50             : #include "poolhelp.hxx"
      51             : #include "docpool.hxx"
      52             : #include "detfunc.hxx"
      53             : #include "editutil.hxx"
      54             : #include "postit.hxx"
      55             : #include "charthelper.hxx"
      56             : #include "interpre.hxx"
      57             : #include <documentlinkmgr.hxx>
      58             : 
      59             : using namespace ::com::sun::star;
      60             : #include <stdio.h>
      61             : 
      62          72 : SfxBroadcaster* ScDocument::GetDrawBroadcaster()
      63             : {
      64          72 :     return pDrawLayer;
      65             : }
      66             : 
      67         334 : void ScDocument::BeginDrawUndo()
      68             : {
      69         334 :     if (pDrawLayer)
      70         258 :         pDrawLayer->BeginCalcUndo(false);
      71         334 : }
      72             : 
      73           0 : rtl::Reference<XColorList> ScDocument::GetColorList()
      74             : {
      75           0 :     if (pDrawLayer)
      76           0 :         return pDrawLayer->GetColorList();
      77             :     else
      78             :     {
      79           0 :         if (!pColorList.is())
      80           0 :             pColorList = XColorList::CreateStdColorList();
      81           0 :         return pColorList;
      82             :     }
      83             : }
      84             : 
      85          26 : void ScDocument::TransferDrawPage(ScDocument* pSrcDoc, SCTAB nSrcPos, SCTAB nDestPos)
      86             : {
      87          26 :     if (pDrawLayer && pSrcDoc->pDrawLayer)
      88             :     {
      89          20 :         SdrPage* pOldPage = pSrcDoc->pDrawLayer->GetPage(static_cast<sal_uInt16>(nSrcPos));
      90          20 :         SdrPage* pNewPage = pDrawLayer->GetPage(static_cast<sal_uInt16>(nDestPos));
      91             : 
      92          20 :         if (pOldPage && pNewPage)
      93             :         {
      94          20 :             SdrObjListIter aIter( *pOldPage, IM_FLAT );
      95          20 :             SdrObject* pOldObject = aIter.Next();
      96          40 :             while (pOldObject)
      97             :             {
      98             :                 // #116235#
      99           0 :                 SdrObject* pNewObject = pOldObject->Clone();
     100             :                 // SdrObject* pNewObject = pOldObject->Clone( pNewPage, pDrawLayer );
     101           0 :                 pNewObject->SetModel(pDrawLayer);
     102           0 :                 pNewObject->SetPage(pNewPage);
     103             : 
     104           0 :                 pNewObject->NbcMove(Size(0,0));
     105           0 :                 pNewPage->InsertObject( pNewObject );
     106             : 
     107           0 :                 if (pDrawLayer->IsRecording())
     108           0 :                     pDrawLayer->AddCalcUndo( new SdrUndoInsertObj( *pNewObject ) );
     109             : 
     110           0 :                 pOldObject = aIter.Next();
     111          20 :             }
     112             :         }
     113             :     }
     114             : 
     115             :     //  make sure the data references of charts are adapted
     116             :     //  (this must be after InsertObject!)
     117          26 :     ScChartHelper::AdjustRangesOfChartsOnDestinationPage( pSrcDoc, this, nSrcPos, nDestPos );
     118          26 :     ScChartHelper::UpdateChartsOnDestinationPage(this, nDestPos);
     119          26 : }
     120             : 
     121        2411 : void ScDocument::InitDrawLayer( SfxObjectShell* pDocShell )
     122             : {
     123        2411 :     if (pDocShell && !pShell)
     124           0 :         pShell = pDocShell;
     125             : 
     126        2411 :     if (!pDrawLayer)
     127             :     {
     128         826 :         OUString aName;
     129         826 :         if ( pShell && !pShell->IsLoading() )       // don't call GetTitle while loading
     130         438 :             aName = pShell->GetTitle();
     131         826 :         pDrawLayer = new ScDrawLayer( this, aName );
     132             : 
     133         826 :         sfx2::LinkManager* pMgr = GetDocLinkManager().getLinkManager(bAutoCalc);
     134         826 :         if (pMgr)
     135         824 :             pDrawLayer->SetLinkManager(pMgr);
     136             : 
     137             :         //UUUU set DrawingLayer's SfxItemPool at Calc's SfxItemPool as
     138             :         // secondary pool to support DrawingLayer FillStyle ranges (and similar)
     139             :         // in SfxItemSets using the Calc SfxItemPool. This is e.g. needed when
     140             :         // the PageStyle using SvxBrushItem is visualized and will be potentially
     141             :         // used more intense in the future
     142         826 :         if(xPoolHelper.is())
     143             :         {
     144         826 :             ScDocumentPool* pLocalPool = xPoolHelper->GetDocPool();
     145             : 
     146         826 :             if(pLocalPool)
     147             :             {
     148             :                 OSL_ENSURE(!pLocalPool->GetSecondaryPool(), "OOps, already a secondary pool set where the DrawingLayer ItemPool is to be placed (!)");
     149         826 :                 pLocalPool->SetSecondaryPool(&pDrawLayer->GetItemPool());
     150             :             }
     151             :         }
     152             : 
     153             :         //  Drawing pages are accessed by table number, so they must also be present
     154             :         //  for preceding table numbers, even if the tables aren't allocated
     155             :         //  (important for clipboard documents).
     156             : 
     157         826 :         SCTAB nDrawPages = 0;
     158             :         SCTAB nTab;
     159        1850 :         for (nTab=0; nTab < static_cast<SCTAB>(maTabs.size()); nTab++)
     160        1024 :             if (maTabs[nTab])
     161        1024 :                 nDrawPages = nTab + 1;          // needed number of pages
     162             : 
     163        1850 :         for (nTab=0; nTab<nDrawPages && nTab < static_cast<SCTAB>(maTabs.size()); nTab++)
     164             :         {
     165        1024 :             pDrawLayer->ScAddPage( nTab );      // always add page, with or without the table
     166        1024 :             if (maTabs[nTab])
     167             :             {
     168        1024 :                 OUString aTabName;
     169        1024 :                 maTabs[nTab]->GetName(aTabName);
     170        1024 :                 pDrawLayer->ScRenamePage( nTab, aTabName );
     171             : 
     172        1024 :                 maTabs[nTab]->SetDrawPageSize(false,false);     // set the right size immediately
     173             :             }
     174             :         }
     175             : 
     176         826 :         pDrawLayer->SetDefaultTabulator( GetDocOptions().GetTabDistance() );
     177             : 
     178         826 :         UpdateDrawPrinter();
     179             : 
     180             :         // set draw defaults directly
     181         826 :         SfxItemPool& rDrawPool = pDrawLayer->GetItemPool();
     182         826 :         rDrawPool.SetPoolDefaultItem( SvxAutoKernItem( true, EE_CHAR_PAIRKERNING ) );
     183             : 
     184         826 :         UpdateDrawLanguages();
     185         826 :         if (bImportingXML)
     186         112 :             pDrawLayer->EnableAdjust(false);
     187             : 
     188         826 :         pDrawLayer->SetForbiddenCharsTable( xForbiddenCharacters );
     189         826 :         pDrawLayer->SetCharCompressType( GetAsianCompression() );
     190         826 :         pDrawLayer->SetKernAsianPunctuation( GetAsianKerning() );
     191             :     }
     192        2411 : }
     193             : 
     194        6854 : void ScDocument::UpdateDrawLanguages()
     195             : {
     196        6854 :     if (pDrawLayer)
     197             :     {
     198         946 :         SfxItemPool& rDrawPool = pDrawLayer->GetItemPool();
     199         946 :         rDrawPool.SetPoolDefaultItem( SvxLanguageItem( eLanguage, EE_CHAR_LANGUAGE ) );
     200         946 :         rDrawPool.SetPoolDefaultItem( SvxLanguageItem( eCjkLanguage, EE_CHAR_LANGUAGE_CJK ) );
     201         946 :         rDrawPool.SetPoolDefaultItem( SvxLanguageItem( eCtlLanguage, EE_CHAR_LANGUAGE_CTL ) );
     202             :     }
     203        6854 : }
     204             : 
     205        1326 : void ScDocument::UpdateDrawPrinter()
     206             : {
     207        1326 :     if (pDrawLayer)
     208             :     {
     209             :         // use the printer even if IsValid is false
     210             :         // Application::GetDefaultDevice causes trouble with changing MapModes
     211         868 :         pDrawLayer->SetRefDevice(GetRefDevice());
     212             :     }
     213        1326 : }
     214             : 
     215        5564 : void ScDocument::SetDrawPageSize(SCTAB nTab)
     216             : {
     217        5564 :     if (!ValidTab(nTab) || nTab >= static_cast<SCTAB>(maTabs.size()) || !maTabs[nTab])
     218        5564 :         return;
     219             : 
     220        5564 :     maTabs[nTab]->SetDrawPageSize();
     221             : }
     222             : 
     223         350 : bool ScDocument::IsChart( const SdrObject* pObject )
     224             : {
     225             :     // #109985#
     226             :     // IsChart() implementation moved to svx drawinglayer
     227         350 :     if(pObject && OBJ_OLE2 == pObject->GetObjIdentifier())
     228             :     {
     229         350 :         return static_cast<const SdrOle2Obj*>(pObject)->IsChart();
     230             :     }
     231             : 
     232           0 :     return false;
     233             : }
     234             : 
     235           0 : IMPL_LINK_INLINE_START( ScDocument, GetUserDefinedColor, sal_uInt16 *, pColorIndex )
     236             : {
     237           0 :     return reinterpret_cast<sal_IntPtr>( &((GetColorList()->GetColor(*pColorIndex))->GetColor()) );
     238             : }
     239           0 : IMPL_LINK_INLINE_END( ScDocument, GetUserDefinedColor, sal_uInt16 *, pColorIndex )
     240             : 
     241        4192 : void ScDocument::DeleteDrawLayer()
     242             : {
     243             :     //UUUU remove DrawingLayer's SfxItemPool from Calc's SfxItemPool where
     244             :     // it is registered as secondary pool
     245        4192 :     if(xPoolHelper.is())
     246             :     {
     247        4192 :         ScDocumentPool* pLocalPool = xPoolHelper->GetDocPool();
     248             : 
     249        4192 :         if(pLocalPool && pLocalPool->GetSecondaryPool())
     250             :         {
     251         826 :             pLocalPool->SetSecondaryPool(0);
     252             :         }
     253             :     }
     254        4192 :     delete pDrawLayer;
     255        4192 :     pDrawLayer = 0;
     256        4192 : }
     257             : 
     258        5192 : bool ScDocument::DrawGetPrintArea( ScRange& rRange, bool bSetHor, bool bSetVer ) const
     259             : {
     260        5192 :     return pDrawLayer->GetPrintArea( rRange, bSetHor, bSetVer );
     261             : }
     262             : 
     263           2 : void ScDocument::DrawMovePage( sal_uInt16 nOldPos, sal_uInt16 nNewPos )
     264             : {
     265           2 :     pDrawLayer->ScMovePage(nOldPos,nNewPos);
     266           2 : }
     267             : 
     268           4 : void ScDocument::DrawCopyPage( sal_uInt16 nOldPos, sal_uInt16 nNewPos )
     269             : {
     270             :     // angelegt wird die Page schon im ScTable ctor
     271           4 :     pDrawLayer->ScCopyPage( nOldPos, nNewPos );
     272           4 : }
     273             : 
     274          28 : void ScDocument::DeleteObjectsInArea( SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2,
     275             :                         const ScMarkData& rMark )
     276             : {
     277          28 :     if (!pDrawLayer)
     278          54 :         return;
     279             : 
     280           2 :     SCTAB nTabCount = GetTableCount();
     281           2 :     ScMarkData::const_iterator itr = rMark.begin(), itrEnd = rMark.end();
     282           4 :     for (; itr != itrEnd && *itr < nTabCount; ++itr)
     283           2 :         if (maTabs[*itr])
     284           2 :             pDrawLayer->DeleteObjectsInArea( *itr, nCol1, nRow1, nCol2, nRow2 );
     285             : }
     286             : 
     287           2 : void ScDocument::DeleteObjectsInSelection( const ScMarkData& rMark )
     288             : {
     289           2 :     if (!pDrawLayer)
     290           4 :         return;
     291             : 
     292           0 :     pDrawLayer->DeleteObjectsInSelection( rMark );
     293             : }
     294             : 
     295          56 : bool ScDocument::HasOLEObjectsInArea( const ScRange& rRange, const ScMarkData* pTabMark )
     296             : {
     297             :     //  pTabMark is used only for selected tables. If pTabMark is 0, all tables of rRange are used.
     298             : 
     299          56 :     if (!pDrawLayer)
     300          30 :         return false;
     301             : 
     302          26 :     SCTAB nStartTab = 0;
     303          26 :     SCTAB nEndTab = static_cast<SCTAB>(maTabs.size());
     304          26 :     if ( !pTabMark )
     305             :     {
     306          26 :         nStartTab = rRange.aStart.Tab();
     307          26 :         nEndTab = rRange.aEnd.Tab();
     308             :     }
     309             : 
     310          52 :     for (SCTAB nTab = nStartTab; nTab <= nEndTab; nTab++)
     311             :     {
     312          26 :         if ( !pTabMark || pTabMark->GetTableSelect(nTab) )
     313             :         {
     314          26 :             Rectangle aMMRect = GetMMRect( rRange.aStart.Col(), rRange.aStart.Row(),
     315          52 :                                             rRange.aEnd.Col(), rRange.aEnd.Row(), nTab );
     316             : 
     317          26 :             SdrPage* pPage = pDrawLayer->GetPage(static_cast<sal_uInt16>(nTab));
     318             :             OSL_ENSURE(pPage,"Page ?");
     319          26 :             if (pPage)
     320             :             {
     321          26 :                 SdrObjListIter aIter( *pPage, IM_FLAT );
     322          26 :                 SdrObject* pObject = aIter.Next();
     323          78 :                 while (pObject)
     324             :                 {
     325          26 :                     if ( pObject->GetObjIdentifier() == OBJ_OLE2 &&
     326           0 :                             aMMRect.IsInside( pObject->GetCurrentBoundRect() ) )
     327           0 :                         return true;
     328             : 
     329          26 :                     pObject = aIter.Next();
     330          26 :                 }
     331             :             }
     332             :         }
     333             :     }
     334             : 
     335          26 :     return false;
     336             : }
     337             : 
     338           0 : void ScDocument::StartAnimations( SCTAB nTab, vcl::Window* pWin )
     339             : {
     340           0 :     if (!pDrawLayer)
     341           0 :         return;
     342           0 :     SdrPage* pPage = pDrawLayer->GetPage(static_cast<sal_uInt16>(nTab));
     343             :     OSL_ENSURE(pPage,"Page ?");
     344           0 :     if (!pPage)
     345           0 :         return;
     346             : 
     347           0 :     SdrObjListIter aIter( *pPage, IM_FLAT );
     348           0 :     SdrObject* pObject = aIter.Next();
     349           0 :     while (pObject)
     350             :     {
     351           0 :         if (pObject->ISA(SdrGrafObj))
     352             :         {
     353           0 :             SdrGrafObj* pGrafObj = static_cast<SdrGrafObj*>(pObject);
     354           0 :             if ( pGrafObj->IsAnimated() )
     355             :             {
     356           0 :                 const Rectangle& rRect = pGrafObj->GetCurrentBoundRect();
     357           0 :                 pGrafObj->StartAnimation( pWin, rRect.TopLeft(), rRect.GetSize() );
     358             :             }
     359             :         }
     360           0 :         pObject = aIter.Next();
     361           0 :     }
     362             : }
     363             : 
     364        1474 : bool ScDocument::HasBackgroundDraw( SCTAB nTab, const Rectangle& rMMRect ) const
     365             : {
     366             :     //  Gibt es Objekte auf dem Hintergrund-Layer, die (teilweise) von rMMRect
     367             :     //  betroffen sind?
     368             :     //  (fuer Drawing-Optimierung, vor dem Hintergrund braucht dann nicht geloescht
     369             :     //   zu werden)
     370             : 
     371        1474 :     if (!pDrawLayer)
     372           0 :         return false;
     373        1474 :     SdrPage* pPage = pDrawLayer->GetPage(static_cast<sal_uInt16>(nTab));
     374             :     OSL_ENSURE(pPage,"Page ?");
     375        1474 :     if (!pPage)
     376           0 :         return false;
     377             : 
     378        1474 :     bool bFound = false;
     379             : 
     380        1474 :     SdrObjListIter aIter( *pPage, IM_FLAT );
     381        1474 :     SdrObject* pObject = aIter.Next();
     382        3522 :     while (pObject && !bFound)
     383             :     {
     384         574 :         if ( pObject->GetLayer() == SC_LAYER_BACK && pObject->GetCurrentBoundRect().IsOver( rMMRect ) )
     385           0 :             bFound = true;
     386         574 :         pObject = aIter.Next();
     387             :     }
     388             : 
     389        1474 :     return bFound;
     390             : }
     391             : 
     392           2 : bool ScDocument::HasAnyDraw( SCTAB nTab, const Rectangle& rMMRect ) const
     393             : {
     394             :     //  Gibt es ueberhaupt Objekte, die (teilweise) von rMMRect
     395             :     //  betroffen sind?
     396             :     //  (um leere Seiten beim Drucken zu erkennen)
     397             : 
     398           2 :     if (!pDrawLayer)
     399           2 :         return false;
     400           0 :     SdrPage* pPage = pDrawLayer->GetPage(static_cast<sal_uInt16>(nTab));
     401             :     OSL_ENSURE(pPage,"Page ?");
     402           0 :     if (!pPage)
     403           0 :         return false;
     404             : 
     405           0 :     bool bFound = false;
     406             : 
     407           0 :     SdrObjListIter aIter( *pPage, IM_FLAT );
     408           0 :     SdrObject* pObject = aIter.Next();
     409           0 :     while (pObject && !bFound)
     410             :     {
     411           0 :         if ( pObject->GetCurrentBoundRect().IsOver( rMMRect ) )
     412           0 :             bFound = true;
     413           0 :         pObject = aIter.Next();
     414             :     }
     415             : 
     416           0 :     return bFound;
     417             : }
     418             : 
     419         146 : void ScDocument::EnsureGraphicNames()
     420             : {
     421         146 :     if (pDrawLayer)
     422         146 :         pDrawLayer->EnsureGraphicNames();
     423         146 : }
     424             : 
     425           0 : SdrObject* ScDocument::GetObjectAtPoint( SCTAB nTab, const Point& rPos )
     426             : {
     427             :     //  fuer Drag&Drop auf Zeichenobjekt
     428             : 
     429           0 :     SdrObject* pFound = NULL;
     430           0 :     if (pDrawLayer && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab])
     431             :     {
     432           0 :         SdrPage* pPage = pDrawLayer->GetPage(static_cast<sal_uInt16>(nTab));
     433             :         OSL_ENSURE(pPage,"Page ?");
     434           0 :         if (pPage)
     435             :         {
     436           0 :             SdrObjListIter aIter( *pPage, IM_FLAT );
     437           0 :             SdrObject* pObject = aIter.Next();
     438           0 :             while (pObject)
     439             :             {
     440           0 :                 if ( pObject->GetCurrentBoundRect().IsInside(rPos) )
     441             :                 {
     442             :                     //  Intern interessiert gar nicht
     443             :                     //  Objekt vom Back-Layer nur, wenn kein Objekt von anderem Layer getroffen
     444             : 
     445           0 :                     SdrLayerID nLayer = pObject->GetLayer();
     446           0 :                     if ( (nLayer != SC_LAYER_INTERN) && (nLayer != SC_LAYER_HIDDEN) )
     447             :                     {
     448           0 :                         if ( nLayer != SC_LAYER_BACK ||
     449           0 :                                 !pFound || pFound->GetLayer() == SC_LAYER_BACK )
     450             :                         {
     451           0 :                             pFound = pObject;
     452             :                         }
     453             :                     }
     454             :                 }
     455             :                 //  weitersuchen -> letztes (oberstes) getroffenes Objekt nehmen
     456             : 
     457           0 :                 pObject = aIter.Next();
     458           0 :             }
     459             :         }
     460             :     }
     461           0 :     return pFound;
     462             : }
     463             : 
     464         284 : bool ScDocument::IsPrintEmpty( SCTAB nTab, SCCOL nStartCol, SCROW nStartRow,
     465             :                                 SCCOL nEndCol, SCROW nEndRow, bool bLeftIsEmpty,
     466             :                                 ScRange* pLastRange, Rectangle* pLastMM ) const
     467             : {
     468         284 :     if (!IsBlockEmpty( nTab, nStartCol, nStartRow, nEndCol, nEndRow ))
     469         280 :         return false;
     470             : 
     471           4 :     if (HasAttrib(ScRange(nStartCol, nStartRow, nTab, nEndCol, nEndRow, nTab), HASATTR_LINES))
     472             :         // We want to print sheets with borders even if there is no cell content.
     473           2 :         return false;
     474             : 
     475           2 :     Rectangle aMMRect;
     476           2 :     if ( pLastRange && pLastMM && nTab == pLastRange->aStart.Tab() &&
     477           2 :             nStartRow == pLastRange->aStart.Row() && nEndRow == pLastRange->aEnd.Row() )
     478             :     {
     479             :         //  keep vertical part of aMMRect, only update horizontal position
     480           0 :         aMMRect = *pLastMM;
     481             : 
     482           0 :         long nLeft = 0;
     483             :         SCCOL i;
     484           0 :         for (i=0; i<nStartCol; i++)
     485           0 :             nLeft += GetColWidth(i,nTab);
     486           0 :         long nRight = nLeft;
     487           0 :         for (i=nStartCol; i<=nEndCol; i++)
     488           0 :             nRight += GetColWidth(i,nTab);
     489             : 
     490           0 :         aMMRect.Left()  = (long)(nLeft  * HMM_PER_TWIPS);
     491           0 :         aMMRect.Right() = (long)(nRight * HMM_PER_TWIPS);
     492             :     }
     493             :     else
     494           2 :         aMMRect = GetMMRect( nStartCol, nStartRow, nEndCol, nEndRow, nTab );
     495             : 
     496           2 :     if ( pLastRange && pLastMM )
     497             :     {
     498           0 :         *pLastRange = ScRange( nStartCol, nStartRow, nTab, nEndCol, nEndRow, nTab );
     499           0 :         *pLastMM = aMMRect;
     500             :     }
     501             : 
     502           2 :     if ( HasAnyDraw( nTab, aMMRect ))
     503           0 :         return false;
     504             : 
     505           2 :     if ( nStartCol > 0 && !bLeftIsEmpty )
     506             :     {
     507             :         //  aehnlich wie in ScPrintFunc::AdjustPrintArea
     508             :         //! ExtendPrintArea erst ab Start-Spalte des Druckbereichs
     509             : 
     510           0 :         SCCOL nExtendCol = nStartCol - 1;
     511           0 :         SCROW nTmpRow = nEndRow;
     512             : 
     513             :         // ExtendMerge() is non-const, but called without refresh. GetPrinter()
     514             :         // might create and assign a printer.
     515           0 :         ScDocument* pThis = const_cast<ScDocument*>(this);
     516             : 
     517             :         pThis->ExtendMerge( 0,nStartRow, nExtendCol,nTmpRow, nTab,
     518           0 :                             false );      // kein Refresh, incl. Attrs
     519             : 
     520           0 :         OutputDevice* pDev = pThis->GetPrinter();
     521           0 :         pDev->SetMapMode( MAP_PIXEL );              // wichtig fuer GetNeededSize
     522           0 :         ExtendPrintArea( pDev, nTab, 0, nStartRow, nExtendCol, nEndRow );
     523           0 :         if ( nExtendCol >= nStartCol )
     524           0 :             return false;
     525             :     }
     526             : 
     527           2 :     return true;
     528             : }
     529             : 
     530        6186 : void ScDocument::Clear( bool bFromDestructor )
     531             : {
     532        6186 :     TableContainer::iterator it = maTabs.begin();
     533       10382 :     for (;it != maTabs.end(); ++it)
     534        4196 :         delete *it;
     535        6186 :     maTabs.clear();
     536        6186 :     delete pSelectionAttr;
     537        6186 :     pSelectionAttr = NULL;
     538             : 
     539        6186 :     if (pDrawLayer)
     540             :     {
     541         824 :         pDrawLayer->ClearModel( bFromDestructor );
     542             :     }
     543        6186 : }
     544             : 
     545        3322 : bool ScDocument::HasDetectiveObjects(SCTAB nTab) const
     546             : {
     547             :     //  looks for detective objects, annotations don't count
     548             :     //  (used to adjust scale so detective objects hit their cells better)
     549             : 
     550        3322 :     bool bFound = false;
     551             : 
     552        3322 :     if (pDrawLayer)
     553             :     {
     554        2526 :         SdrPage* pPage = pDrawLayer->GetPage(static_cast<sal_uInt16>(nTab));
     555             :         OSL_ENSURE(pPage,"Page ?");
     556        2526 :         if (pPage)
     557             :         {
     558        2526 :             SdrObjListIter aIter( *pPage, IM_DEEPNOGROUPS );
     559        2526 :             SdrObject* pObject = aIter.Next();
     560        6002 :             while (pObject && !bFound)
     561             :             {
     562             :                 // anything on the internal layer except captions (annotations)
     563         950 :                 if ( (pObject->GetLayer() == SC_LAYER_INTERN) && !ScDrawLayer::IsNoteCaption( pObject ) )
     564           0 :                     bFound = true;
     565             : 
     566         950 :                 pObject = aIter.Next();
     567        2526 :             }
     568             :         }
     569             :     }
     570             : 
     571        3322 :     return bFound;
     572             : }
     573             : 
     574         146 : void ScDocument::UpdateFontCharSet()
     575             : {
     576             :     //  In alten Versionen (bis incl. 4.0 ohne SP) wurden beim Austausch zwischen
     577             :     //  Systemen die CharSets in den Font-Attributen nicht angepasst.
     578             :     //  Das muss fuer Dokumente bis incl SP2 nun nachgeholt werden:
     579             :     //  Alles, was nicht SYMBOL ist, wird auf den System-CharSet umgesetzt.
     580             :     //  Bei neuen Dokumenten (Version SC_FONTCHARSET) sollte der CharSet stimmen.
     581             : 
     582         146 :     bool bUpdateOld = ( nSrcVer < SC_FONTCHARSET );
     583             : 
     584         146 :     rtl_TextEncoding eSysSet = osl_getThreadTextEncoding();
     585         146 :     if ( eSrcSet != eSysSet || bUpdateOld )
     586             :     {
     587             :         sal_uInt32 nCount,i;
     588             :         SvxFontItem* pItem;
     589             : 
     590         144 :         ScDocumentPool* pPool = xPoolHelper->GetDocPool();
     591         144 :         nCount = pPool->GetItemCount2(ATTR_FONT);
     592         332 :         for (i=0; i<nCount; i++)
     593             :         {
     594         188 :             pItem = const_cast<SvxFontItem*>(static_cast<const SvxFontItem*>(pPool->GetItem2(ATTR_FONT, i)));
     595         344 :             if ( pItem && ( pItem->GetCharSet() == eSrcSet ||
     596           0 :                             ( bUpdateOld && pItem->GetCharSet() != RTL_TEXTENCODING_SYMBOL ) ) )
     597         156 :                 pItem->SetCharSet(eSysSet);
     598             :         }
     599             : 
     600         144 :         if ( pDrawLayer )
     601             :         {
     602         144 :             SfxItemPool& rDrawPool = pDrawLayer->GetItemPool();
     603         144 :             nCount = rDrawPool.GetItemCount2(EE_CHAR_FONTINFO);
     604         152 :             for (i=0; i<nCount; i++)
     605             :             {
     606           8 :                 pItem = const_cast<SvxFontItem*>(static_cast<const SvxFontItem*>(rDrawPool.GetItem2(EE_CHAR_FONTINFO, i)));
     607           8 :                 if ( pItem && ( pItem->GetCharSet() == eSrcSet ||
     608           0 :                                 ( bUpdateOld && pItem->GetCharSet() != RTL_TEXTENCODING_SYMBOL ) ) )
     609           0 :                     pItem->SetCharSet( eSysSet );
     610             :             }
     611             :         }
     612             :     }
     613         146 : }
     614             : 
     615        2072 : void ScDocument::SetLoadingMedium( bool bVal )
     616             : {
     617        2072 :     bLoadingMedium = bVal;
     618        2072 :     TableContainer::iterator it = maTabs.begin();
     619        4920 :     for (; it != maTabs.end(); ++it)
     620             :     {
     621        2848 :         if (!*it)
     622        2072 :             return;
     623             : 
     624        2848 :         (*it)->SetLoadingMedium(bVal);
     625             :     }
     626             : }
     627             : 
     628         652 : void ScDocument::SetImportingXML( bool bVal )
     629             : {
     630         652 :     bImportingXML = bVal;
     631         652 :     if (pDrawLayer)
     632         228 :         pDrawLayer->EnableAdjust(!bImportingXML);
     633             : 
     634         652 :     if ( !bVal )
     635             :     {
     636             :         // #i57869# after loading, do the real RTL mirroring for the sheets that have the LoadingRTL flag set
     637             : 
     638         908 :         for ( SCTAB nTab=0; nTab< static_cast<SCTAB>(maTabs.size()) && maTabs[nTab]; nTab++ )
     639         582 :             if ( maTabs[nTab]->IsLoadingRTL() )
     640             :             {
     641           0 :                 maTabs[nTab]->SetLoadingRTL( false );
     642           0 :                 SetLayoutRTL( nTab, true );             // includes mirroring; bImportingXML must be cleared first
     643             :             }
     644             :     }
     645             : 
     646         652 :     SetLoadingMedium(bVal);
     647         652 : }
     648             : 
     649        3930 : rtl::Reference<SvxForbiddenCharactersTable> ScDocument::GetForbiddenCharacters()
     650             : {
     651        3930 :     return xForbiddenCharacters;
     652             : }
     653             : 
     654          92 : void ScDocument::SetForbiddenCharacters( const rtl::Reference<SvxForbiddenCharactersTable> xNew )
     655             : {
     656          92 :     xForbiddenCharacters = xNew;
     657          92 :     if ( pEditEngine )
     658          10 :         pEditEngine->SetForbiddenCharsTable( xForbiddenCharacters );
     659          92 :     if ( pDrawLayer )
     660          50 :         pDrawLayer->SetForbiddenCharsTable( xForbiddenCharacters );
     661          92 : }
     662             : 
     663        1940 : bool ScDocument::IsValidAsianCompression() const
     664             : {
     665        1940 :     return ( nAsianCompression != SC_ASIANCOMPRESSION_INVALID );
     666             : }
     667             : 
     668        3836 : sal_uInt8 ScDocument::GetAsianCompression() const
     669             : {
     670        3836 :     if ( nAsianCompression == SC_ASIANCOMPRESSION_INVALID )
     671          36 :         return 0;
     672             :     else
     673        3800 :         return nAsianCompression;
     674             : }
     675             : 
     676         958 : void ScDocument::SetAsianCompression(sal_uInt8 nNew)
     677             : {
     678         958 :     nAsianCompression = nNew;
     679         958 :     if ( pEditEngine )
     680           0 :         pEditEngine->SetAsianCompressionMode( nAsianCompression );
     681         958 :     if ( pDrawLayer )
     682           4 :         pDrawLayer->SetCharCompressType( nAsianCompression );
     683         958 : }
     684             : 
     685        1940 : bool ScDocument::IsValidAsianKerning() const
     686             : {
     687        1940 :     return ( nAsianKerning != SC_ASIANKERNING_INVALID );
     688             : }
     689             : 
     690        3836 : bool ScDocument::GetAsianKerning() const
     691             : {
     692        3836 :     if ( nAsianKerning == SC_ASIANKERNING_INVALID )
     693          36 :         return false;
     694             :     else
     695        3800 :         return static_cast<bool>(nAsianKerning);
     696             : }
     697             : 
     698         958 : void ScDocument::SetAsianKerning(bool bNew)
     699             : {
     700         958 :     nAsianKerning = (sal_uInt8)bNew;
     701         958 :     if ( pEditEngine )
     702           0 :         pEditEngine->SetKernAsianPunctuation( static_cast<bool>( nAsianKerning ) );
     703         958 :     if ( pDrawLayer )
     704           4 :         pDrawLayer->SetKernAsianPunctuation( static_cast<bool>( nAsianKerning ) );
     705         958 : }
     706             : 
     707        2952 : void ScDocument::ApplyAsianEditSettings( ScEditEngineDefaulter& rEngine )
     708             : {
     709        2952 :     rEngine.SetForbiddenCharsTable( xForbiddenCharacters );
     710        2952 :     rEngine.SetAsianCompressionMode( GetAsianCompression() );
     711        2952 :     rEngine.SetKernAsianPunctuation( GetAsianKerning() );
     712        3180 : }
     713             : 
     714             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10