LCOV - code coverage report
Current view: top level - svx/source/svdraw - svdpagv.cxx (source / functions) Hit Total Coverage
Test: commit 10e77ab3ff6f4314137acd6e2702a6e5c1ce1fae Lines: 310 471 65.8 %
Date: 2014-11-03 Functions: 35 45 77.8 %
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 <svx/svdpagv.hxx>
      21             : #include <com/sun/star/awt/XWindow.hpp>
      22             : #include <com/sun/star/awt/PosSize.hpp>
      23             : #include <comphelper/processfactory.hxx>
      24             : #include <svx/svdoutl.hxx>
      25             : #include <svx/xpoly.hxx>
      26             : #include <svx/svdouno.hxx>
      27             : #include <svx/svdpage.hxx>
      28             : #include <svx/svdview.hxx>
      29             : 
      30             : #include <svx/svdedxv.hxx>
      31             : #include <editeng/outliner.hxx>
      32             : #include <svx/svdetc.hxx>
      33             : #include <svx/svdobj.hxx>
      34             : #include "svx/svditer.hxx"
      35             : #include <svx/svdogrp.hxx>
      36             : #include <svx/svdtypes.hxx>
      37             : #include <svx/svdoole2.hxx>
      38             : 
      39             : #include <sdr/contact/objectcontactofpageview.hxx>
      40             : #include <svx/sdr/contact/viewobjectcontactredirector.hxx>
      41             : #include <svx/fmview.hxx>
      42             : 
      43             : #include <algorithm>
      44             : 
      45             : #include <svx/sdrpagewindow.hxx>
      46             : #include <svx/sdrpaintwindow.hxx>
      47             : 
      48             : 
      49             : using namespace ::com::sun::star;
      50             : 
      51             : // interface to SdrPageWindow
      52             : 
      53       83836 : SdrPageWindow* SdrPageView::FindPageWindow(SdrPaintWindow& rPaintWindow) const
      54             : {
      55       83928 :     for(SdrPageWindowVector::const_iterator a = maPageWindows.begin(); a != maPageWindows.end(); ++a)
      56             :     {
      57       75981 :         if(&((*a)->GetPaintWindow()) == &rPaintWindow)
      58             :         {
      59       75889 :             return *a;
      60             :         }
      61             :     }
      62             : 
      63        7947 :     return 0L;
      64             : }
      65             : 
      66         818 : const SdrPageWindow* SdrPageView::FindPatchedPageWindow( const OutputDevice& _rOutDev ) const
      67             : {
      68        2478 :     for (   SdrPageWindowVector::const_iterator loop = maPageWindows.begin();
      69        1652 :             loop != maPageWindows.end();
      70             :             ++loop
      71             :         )
      72             :     {
      73         826 :         const SdrPageWindow& rPageWindow( *(*loop) );
      74         826 :         const SdrPaintWindow& rPaintWindow( rPageWindow.GetOriginalPaintWindow() ? *rPageWindow.GetOriginalPaintWindow() : rPageWindow.GetPaintWindow() );
      75         826 :         if ( &rPaintWindow.GetOutputDevice() == &_rOutDev )
      76             :         {
      77         818 :             return &rPageWindow;
      78             :         }
      79             :     }
      80             : 
      81           0 :     return NULL;
      82             : }
      83             : 
      84       76620 : SdrPageWindow* SdrPageView::FindPageWindow(const OutputDevice& rOutDev) const
      85             : {
      86      118846 :     for(SdrPageWindowVector::const_iterator a = maPageWindows.begin(); a != maPageWindows.end(); ++a)
      87             :     {
      88       77187 :         if(&((*a)->GetPaintWindow().GetOutputDevice()) == &rOutDev)
      89             :         {
      90       34961 :             return *a;
      91             :         }
      92             :     }
      93             : 
      94       41659 :     return 0L;
      95             : }
      96             : 
      97       50117 : SdrPageWindow* SdrPageView::GetPageWindow(sal_uInt32 nIndex) const
      98             : {
      99       50117 :     if(nIndex < maPageWindows.size())
     100             :     {
     101       50117 :         return maPageWindows[nIndex];
     102             :     }
     103             : 
     104           0 :     return 0L;
     105             : }
     106             : 
     107       15142 : void SdrPageView::ClearPageWindows()
     108             : {
     109       22173 :     for(SdrPageWindowVector::const_iterator a = maPageWindows.begin(); a != maPageWindows.end(); ++a)
     110             :     {
     111        7031 :         delete *a;
     112             :     }
     113             : 
     114       15142 :     maPageWindows.clear();
     115       15142 : }
     116             : 
     117        7947 : void SdrPageView::AppendPageWindow(SdrPageWindow& rNew)
     118             : {
     119        7947 :     maPageWindows.push_back(&rNew);
     120        7947 : }
     121             : 
     122         886 : SdrPageWindow* SdrPageView::RemovePageWindow(SdrPageWindow& rOld)
     123             : {
     124         886 :     const SdrPageWindowVector::iterator aFindResult = ::std::find(maPageWindows.begin(), maPageWindows.end(), &rOld);
     125             : 
     126         886 :     if(aFindResult != maPageWindows.end())
     127             :     {
     128             :         // remember return value
     129         886 :         SdrPageWindow* pSdrPageWindow = *aFindResult;
     130         886 :         maPageWindows.erase(aFindResult);
     131         886 :         return pSdrPageWindow;
     132             :     }
     133             : 
     134           0 :     return 0L;
     135             : }
     136             : 
     137             : 
     138             : 
     139        8041 : SdrPageView::SdrPageView(SdrPage* pPage1, SdrView& rNewView)
     140             : :   mrView(rNewView),
     141             :     // col_auto color lets the view takes the default SvxColorConfig entry
     142             :     maDocumentColor( COL_AUTO ),
     143             :     maBackgroundColor(COL_AUTO ), // #i48367# also react on autocolor
     144        8041 :     mpPreparedPageWindow(0) // #i72752#
     145             : {
     146        8041 :     mpPage = pPage1;
     147             : 
     148        8041 :     if(mpPage)
     149             :     {
     150        8041 :         aPgOrg.X()=mpPage->GetLftBorder();
     151        8041 :         aPgOrg.Y()=mpPage->GetUppBorder();
     152             :     }
     153        8041 :     mbHasMarked = false;
     154        8041 :     aLayerVisi.SetAll();
     155        8041 :     aLayerPrn.SetAll();
     156             : 
     157        8041 :     mbVisible = false;
     158        8041 :     pAktList = NULL;
     159        8041 :     pAktGroup = NULL;
     160        8041 :     SetAktGroupAndList(NULL, mpPage);
     161             : 
     162       15982 :     for(sal_uInt32 a(0L); a < rNewView.PaintWindowCount(); a++)
     163             :     {
     164        7941 :         AddPaintWindowToPageView(*rNewView.GetPaintWindow(a));
     165             :     }
     166        8041 : }
     167             : 
     168       16022 : SdrPageView::~SdrPageView()
     169             : {
     170             : 
     171             :     // cleanup window vector
     172        8011 :     ClearPageWindows();
     173        8011 : }
     174             : 
     175        7947 : SdrPageWindow& SdrPageView::CreateNewPageWindowEntry(SdrPaintWindow& rPaintWindow)
     176             : {
     177        7947 :     SdrPageWindow& rWindow = *(new SdrPageWindow(*this, rPaintWindow));
     178        7947 :     AppendPageWindow(rWindow);
     179             : 
     180        7947 :     return rWindow;
     181             : }
     182             : 
     183       15888 : void SdrPageView::AddPaintWindowToPageView(SdrPaintWindow& rPaintWindow)
     184             : {
     185       15888 :     if(!FindPageWindow(rPaintWindow))
     186             :     {
     187        7947 :         CreateNewPageWindowEntry(rPaintWindow);
     188             :     }
     189       15888 : }
     190             : 
     191         886 : void SdrPageView::RemovePaintWindowFromPageView(SdrPaintWindow& rPaintWindow)
     192             : {
     193         886 :     SdrPageWindow* pCandidate = FindPageWindow(rPaintWindow);
     194             : 
     195         886 :     if(pCandidate)
     196             :     {
     197         886 :         pCandidate = RemovePageWindow(*pCandidate);
     198             : 
     199         886 :         if(pCandidate)
     200             :         {
     201         886 :             delete pCandidate;
     202             :         }
     203             :     }
     204         886 : }
     205             : 
     206         818 : ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControlContainer > SdrPageView::GetControlContainer( const OutputDevice& _rDevice ) const
     207             : {
     208         818 :     ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControlContainer > xReturn;
     209         818 :     const SdrPageWindow* pCandidate = FindPatchedPageWindow( _rDevice );
     210             : 
     211         818 :     if ( pCandidate )
     212         818 :         xReturn = pCandidate->GetControlContainer( true );
     213             : 
     214         818 :     return xReturn;
     215             : }
     216             : 
     217        3048 : void SdrPageView::ModelHasChanged()
     218             : {
     219        3048 :     if (GetAktGroup()!=NULL) CheckAktGroup();
     220        3048 : }
     221             : 
     222           2 : bool SdrPageView::IsReadOnly() const
     223             : {
     224           2 :     return (0L == GetPage() || GetView().GetModel()->IsReadOnly() || GetPage()->IsReadOnly() || GetObjList()->IsReadOnly());
     225             : }
     226             : 
     227        8041 : void SdrPageView::Show()
     228             : {
     229        8041 :     if(!IsVisible())
     230             :     {
     231        8041 :         mbVisible = true;
     232        8041 :         InvalidateAllWin();
     233             : 
     234       15982 :         for(sal_uInt32 a(0L); a < GetView().PaintWindowCount(); a++)
     235             :         {
     236        7941 :             AddPaintWindowToPageView(*GetView().GetPaintWindow(a));
     237             :         }
     238             :     }
     239        8041 : }
     240             : 
     241        7131 : void SdrPageView::Hide()
     242             : {
     243        7131 :     if(IsVisible())
     244             :     {
     245        7131 :         InvalidateAllWin();
     246        7131 :         mbVisible = false;
     247        7131 :         ClearPageWindows();
     248             :     }
     249        7131 : }
     250             : 
     251           0 : Rectangle SdrPageView::GetPageRect() const
     252             : {
     253           0 :     if (GetPage()==NULL) return Rectangle();
     254           0 :     return Rectangle(Point(),Size(GetPage()->GetWdt()+1,GetPage()->GetHgt()+1));
     255             : }
     256             : 
     257       32892 : void SdrPageView::InvalidateAllWin()
     258             : {
     259       32892 :     if(IsVisible() && GetPage())
     260             :     {
     261       32892 :         Rectangle aRect(Point(0,0),Size(GetPage()->GetWdt()+1,GetPage()->GetHgt()+1));
     262       32892 :         aRect.Union(GetPage()->GetAllObjBoundRect());
     263       32892 :         GetView().InvalidateAllWin(aRect);
     264             :     }
     265       32892 : }
     266             : 
     267             : 
     268             : 
     269       43463 : void SdrPageView::PrePaint()
     270             : {
     271       43463 :     const sal_uInt32 nCount(PageWindowCount());
     272             : 
     273       87064 :     for(sal_uInt32 a(0); a < nCount; a++)
     274             :     {
     275       43601 :         SdrPageWindow* pCandidate = GetPageWindow(a);
     276             : 
     277       43601 :         if(pCandidate)
     278             :         {
     279       43601 :             pCandidate->PrePaint();
     280             :         }
     281             :     }
     282       43463 : }
     283             : 
     284        1019 : void SdrPageView::CompleteRedraw(SdrPaintWindow& rPaintWindow, const vcl::Region& rReg, sdr::contact::ViewObjectContactRedirector* pRedirector) const
     285             : {
     286        1019 :     if(GetPage())
     287             :     {
     288        1019 :         SdrPageWindow* pPageWindow = FindPageWindow(rPaintWindow);
     289        1019 :         bool bIsTempTarget(false);
     290             : 
     291        1019 :         if(!pPageWindow)
     292             :         {
     293             :             // create temp PageWindow
     294           0 :             pPageWindow = new SdrPageWindow(*((SdrPageView*)this), rPaintWindow);
     295           0 :             bIsTempTarget = true;
     296             :         }
     297             : 
     298             :         // do the redraw
     299        1019 :         pPageWindow->PrepareRedraw(rReg);
     300        1019 :         pPageWindow->RedrawAll(pRedirector);
     301             : 
     302             :         // get rid of temp PageWindow
     303        1019 :         if(bIsTempTarget)
     304             :         {
     305           0 :             delete pPageWindow;
     306           0 :             pPageWindow = 0L;
     307             :         }
     308             :     }
     309        1019 : }
     310             : 
     311             : 
     312             : // #i74769# use SdrPaintWindow directly
     313             : 
     314       95788 : void SdrPageView::setPreparedPageWindow(SdrPageWindow* pKnownTarget)
     315             : {
     316             :     // #i72752# remember prepared SdrPageWindow
     317       95788 :     mpPreparedPageWindow = pKnownTarget;
     318       95788 : }
     319             : 
     320       44116 : void SdrPageView::DrawLayer(SdrLayerID nID, OutputDevice* pGivenTarget, sdr::contact::ViewObjectContactRedirector* pRedirector, const Rectangle& rRect) const
     321             : {
     322       44116 :     if(GetPage())
     323             :     {
     324       44116 :         if(pGivenTarget)
     325             :         {
     326       44116 :             const SdrPageWindow* pKnownTarget = FindPageWindow(*pGivenTarget);
     327             : 
     328       44116 :             if(pKnownTarget)
     329             :             {
     330             :                 // paint known target
     331        2457 :                 pKnownTarget->RedrawLayer(&nID, pRedirector);
     332             :             }
     333             :             else
     334             :             {
     335             :                 // #i72752# DrawLayer() uses a OutputDevice different from BeginDrawLayer. This happens
     336             :                 // e.g. when SW paints a single text line in text edit mode. Try to use it
     337       41659 :                 SdrPageWindow* pPreparedTarget = mpPreparedPageWindow;
     338             : 
     339       41659 :                 if(pPreparedTarget)
     340             :                 {
     341             :                     // if we have a prepared target, do not use a new SdrPageWindow since this
     342             :                     // works but is expensive. Just use a temporary PaintWindow
     343       41659 :                     SdrPaintWindow aTemporaryPaintWindow(mrView, *pGivenTarget);
     344             : 
     345             :                     // Copy existing paint region to use the same as prepared in BeginDrawLayer
     346       41659 :                     SdrPaintWindow& rExistingPaintWindow = pPreparedTarget->GetPaintWindow();
     347       41659 :                     const vcl::Region& rExistingRegion = rExistingPaintWindow.GetRedrawRegion();
     348       41659 :                     bool bUseRect(false);
     349       41659 :                     if (!rRect.IsEmpty())
     350             :                     {
     351       24320 :                         vcl::Region r(rExistingRegion);
     352       24320 :                         r.Intersect(rRect);
     353             :                         // fdo#74435: FIXME: visibility check broken if empty
     354       24320 :                         if (!r.IsEmpty())
     355       24076 :                             bUseRect = true;
     356             :                     }
     357       41659 :                     if (!bUseRect)
     358       17583 :                         aTemporaryPaintWindow.SetRedrawRegion(rExistingRegion);
     359             :                     else
     360       24076 :                         aTemporaryPaintWindow.SetRedrawRegion(vcl::Region(rRect));
     361             : 
     362             :                     // patch the ExistingPageWindow
     363       41659 :                     pPreparedTarget->patchPaintWindow(aTemporaryPaintWindow);
     364             : 
     365             :                     // redraw the layer
     366       41659 :                     pPreparedTarget->RedrawLayer(&nID, pRedirector);
     367             : 
     368             :                     // restore the ExistingPageWindow
     369       41659 :                     pPreparedTarget->unpatchPaintWindow();
     370             :                 }
     371             :                 else
     372             :                 {
     373             :                     OSL_FAIL("SdrPageView::DrawLayer: Creating temporary SdrPageWindow (ObjectContact), this should never be needed (!)");
     374             : 
     375             :                     // None of the known OutputDevices is the target of this paint, use
     376             :                     // a temporary SdrPageWindow for this Redraw.
     377           0 :                     SdrPaintWindow aTemporaryPaintWindow(mrView, *pGivenTarget);
     378           0 :                     SdrPageWindow aTemporaryPageWindow(*((SdrPageView*)this), aTemporaryPaintWindow);
     379             : 
     380             :                     // #i72752#
     381             :                     // Copy existing paint region if other PageWindows exist, this was created by
     382             :                     // PrepareRedraw() from BeginDrawLayer(). Needs to be used e.g. when suddenly SW
     383             :                     // paints into an unknown device other than the view was created for (e.g. VirtualDevice)
     384           0 :                     if(PageWindowCount())
     385             :                     {
     386           0 :                         SdrPageWindow* pExistingPageWindow = GetPageWindow(0L);
     387           0 :                         SdrPaintWindow& rExistingPaintWindow = pExistingPageWindow->GetPaintWindow();
     388           0 :                         const vcl::Region& rExistingRegion = rExistingPaintWindow.GetRedrawRegion();
     389           0 :                         aTemporaryPaintWindow.SetRedrawRegion(rExistingRegion);
     390             :                     }
     391             : 
     392           0 :                     aTemporaryPageWindow.RedrawLayer(&nID, pRedirector);
     393             :                 }
     394             :             }
     395             :         }
     396             :         else
     397             :         {
     398             :             // paint in all known windows
     399           0 :             for(sal_uInt32 a(0L); a < PageWindowCount(); a++)
     400             :             {
     401           0 :                 SdrPageWindow* pTarget = GetPageWindow(a);
     402           0 :                 pTarget->RedrawLayer(&nID, pRedirector);
     403             :             }
     404             :         }
     405             :     }
     406       44116 : }
     407             : 
     408          46 : void SdrPageView::SetDesignMode( bool _bDesignMode ) const
     409             : {
     410          92 :     for ( sal_uInt32 i = 0L; i < PageWindowCount(); ++i )
     411             :     {
     412          46 :         const SdrPageWindow& rPageViewWindow = *GetPageWindow(i);
     413          46 :         rPageViewWindow.SetDesignMode( _bDesignMode );
     414             :     }
     415          46 : }
     416             : 
     417             : 
     418             : 
     419          16 : void SdrPageView::DrawPageViewGrid(OutputDevice& rOut, const Rectangle& rRect, Color aColor)
     420             : {
     421          16 :     if (GetPage()==NULL)
     422          16 :         return;
     423             : 
     424          16 :     long nx1=GetView().aGridBig.Width();
     425          16 :     long nx2=GetView().aGridFin.Width();
     426          16 :     long ny1=GetView().aGridBig.Height();
     427          16 :     long ny2=GetView().aGridFin.Height();
     428             : 
     429          16 :     if (nx1==0) nx1=nx2;
     430          16 :     if (nx2==0) nx2=nx1;
     431          16 :     if (ny1==0) ny1=ny2;
     432          16 :     if (ny2==0) ny2=ny1;
     433          16 :     if (nx1==0) { nx1=ny1; nx2=ny2; }
     434          16 :     if (ny1==0) { ny1=nx1; ny2=nx2; }
     435          16 :     if (nx1<0) nx1=-nx1;
     436          16 :     if (nx2<0) nx2=-nx2;
     437          16 :     if (ny1<0) ny1=-ny1;
     438          16 :     if (ny2<0) ny2=-ny2;
     439             : 
     440          16 :     if (nx1!=0)
     441             :     {
     442             :         // no more global output size, use window size instead to decide grid sizes
     443          16 :         long nScreenWdt = rOut.GetOutputSizePixel().Width();
     444             : 
     445          16 :         long nMinDotPix=2;
     446          16 :         long nMinLinPix=4;
     447             : 
     448          16 :         if (nScreenWdt>=1600)
     449             :         {
     450           0 :             nMinDotPix=4;
     451           0 :             nMinLinPix=8;
     452             :         }
     453          16 :         else if (nScreenWdt>=1024)
     454             :         {
     455           0 :             nMinDotPix=3;
     456           0 :             nMinLinPix=6;
     457             :         }
     458             :         else
     459             :         { // e. g. 640x480
     460          16 :             nMinDotPix=2;
     461          16 :             nMinLinPix=4;
     462             :         }
     463          16 :         Size aMinDotDist(rOut.PixelToLogic(Size(nMinDotPix,nMinDotPix)));
     464          16 :         Size aMinLinDist(rOut.PixelToLogic(Size(nMinLinPix,nMinLinPix)));
     465          16 :         bool bHoriSolid=nx2<aMinDotDist.Width();
     466          16 :         bool bVertSolid=ny2<aMinDotDist.Height();
     467             :         // enlarge line offset (minimum 4 pixels)
     468             :         // enlarge by: *2 *5 *10 *20 *50 *100 ...
     469          16 :         int nTgl=0;
     470          16 :         long nVal0=nx1;
     471          32 :         while (nx1<aMinLinDist.Width())
     472             :         {
     473           0 :             long a=nx1;
     474             : 
     475           0 :             if (nTgl==0) nx1*=2;
     476           0 :             if (nTgl==1) nx1=nVal0*5; // => nx1*=2.5
     477           0 :             if (nTgl==2) nx1*=2;
     478             : 
     479           0 :             nVal0=a;
     480           0 :             nTgl++; if (nTgl>=3) nTgl=0;
     481             :         }
     482          16 :         nTgl=0;
     483          16 :         nVal0=ny1;
     484          32 :         while (ny1<aMinLinDist.Height())
     485             :         {
     486           0 :             long a=ny1;
     487             : 
     488           0 :             if (nTgl==0) ny1*=2;
     489           0 :             if (nTgl==1) ny1=nVal0*5; // => ny1*=2.5
     490           0 :             if (nTgl==2) ny1*=2;
     491             : 
     492           0 :             nVal0=a;
     493           0 :             nTgl++;
     494             : 
     495           0 :             if (nTgl>=3) nTgl=0;
     496             :         }
     497             : 
     498          16 :         bool bHoriFine=nx2<nx1;
     499          16 :         bool bVertFine=ny2<ny1;
     500          16 :         bool bHoriLines=bHoriSolid || bHoriFine || !bVertFine;
     501          16 :         bool bVertLines=bVertSolid || bVertFine;
     502             : 
     503          16 :         Color aColorMerk( rOut.GetLineColor() );
     504          16 :         rOut.SetLineColor( aColor );
     505             : 
     506          16 :         bool bMap0=rOut.IsMapModeEnabled();
     507             : 
     508          16 :         long nWrX=0;
     509          16 :         long nWrY=0;
     510          16 :         Point aOrg(aPgOrg);
     511          16 :         long x1=GetPage()->GetLftBorder()+1+nWrX;
     512          16 :         long x2=GetPage()->GetWdt()-GetPage()->GetRgtBorder()-1+nWrY;
     513          16 :         long y1=GetPage()->GetUppBorder()+1+nWrX;
     514          16 :         long y2=GetPage()->GetHgt()-GetPage()->GetLwrBorder()-1+nWrY;
     515          16 :         const SdrPageGridFrameList* pFrames=GetPage()->GetGridFrameList(this,NULL);
     516             : 
     517          16 :         sal_uInt16 nGridPaintAnz=1;
     518          16 :         if (pFrames!=NULL) nGridPaintAnz=pFrames->GetCount();
     519          32 :         for (sal_uInt16 nGridPaintNum=0; nGridPaintNum<nGridPaintAnz; nGridPaintNum++) {
     520          16 :             if (pFrames!=NULL) {
     521          16 :                 const SdrPageGridFrame& rGF=(*pFrames)[nGridPaintNum];
     522          16 :                 nWrX=rGF.GetPaperRect().Left();
     523          16 :                 nWrY=rGF.GetPaperRect().Top();
     524          16 :                 x1=rGF.GetUserArea().Left();
     525          16 :                 x2=rGF.GetUserArea().Right();
     526          16 :                 y1=rGF.GetUserArea().Top();
     527          16 :                 y2=rGF.GetUserArea().Bottom();
     528          16 :                 aOrg=rGF.GetUserArea().TopLeft();
     529          16 :                 aOrg-=rGF.GetPaperRect().TopLeft();
     530             :             }
     531          16 :             if (!rRect.IsEmpty()) {
     532          16 :                 Size a1PixSiz(rOut.PixelToLogic(Size(1,1)));
     533          16 :                 long nX1Pix=a1PixSiz.Width();  // add 1 pixel of tolerance
     534          16 :                 long nY1Pix=a1PixSiz.Height();
     535          16 :                 if (x1<rRect.Left()  -nX1Pix) x1=rRect.Left()  -nX1Pix;
     536          16 :                 if (x2>rRect.Right() +nX1Pix) x2=rRect.Right() +nX1Pix;
     537          16 :                 if (y1<rRect.Top()   -nY1Pix) y1=rRect.Top()   -nY1Pix;
     538          16 :                 if (y2>rRect.Bottom()+nY1Pix) y2=rRect.Bottom()+nY1Pix;
     539             :             }
     540             : 
     541          16 :             long xBigOrg=aOrg.X()+nWrX;
     542          16 :             while (xBigOrg>=x1) xBigOrg-=nx1;
     543          16 :             while (xBigOrg<x1) xBigOrg+=nx1;
     544          16 :             long xFinOrg=xBigOrg;
     545          16 :             while (xFinOrg>=x1) xFinOrg-=nx2;
     546          16 :             while (xFinOrg<x1) xFinOrg+=nx2;
     547             : 
     548          16 :             long yBigOrg=aOrg.Y()+nWrY;
     549          16 :             while (yBigOrg>=y1) yBigOrg-=ny1;
     550          16 :             while (yBigOrg<y1) yBigOrg+=ny1;
     551          16 :             long yFinOrg=yBigOrg;
     552          16 :             while (yFinOrg>=y1) yFinOrg-=ny2;
     553          16 :             while (yFinOrg<y1) yFinOrg+=ny2;
     554             : 
     555          16 :             if( x1 <= x2 && y1 <= y2 )
     556             :             {
     557          16 :                 if( bHoriLines )
     558             :                 {
     559          16 :                     sal_uIntPtr nGridFlags = ( bHoriSolid ? GRID_HORZLINES : GRID_DOTS );
     560          16 :                     sal_uInt16 nSteps = sal_uInt16(nx1 / nx2);
     561          16 :                     sal_uInt32 nRestPerStepMul1000 = nSteps ? ( ((nx1 * 1000L)/ nSteps) - (nx2 * 1000L) ) : 0;
     562          16 :                     sal_uInt32 nStepOffset = 0;
     563          16 :                     sal_uInt16 nPointOffset = 0;
     564             : 
     565         173 :                     for(sal_uInt16 a=0;a<nSteps;a++)
     566             :                     {
     567             :                         // draw
     568             :                         rOut.DrawGrid(
     569         157 :                             Rectangle( xFinOrg + (a * nx2) + nPointOffset, yBigOrg, x2, y2 ),
     570         314 :                             Size( nx1, ny1 ), nGridFlags );
     571             : 
     572             :                         // do a step
     573         157 :                         nStepOffset += nRestPerStepMul1000;
     574         406 :                         while(nStepOffset >= 1000)
     575             :                         {
     576          92 :                             nStepOffset -= 1000;
     577          92 :                             nPointOffset++;
     578             :                         }
     579             :                     }
     580             :                 }
     581             : 
     582          16 :                 if( bVertLines )
     583             :                 {
     584          16 :                     sal_uIntPtr nGridFlags = ( bVertSolid ? GRID_VERTLINES : GRID_DOTS );
     585          16 :                     sal_uInt16 nSteps = sal_uInt16(ny1 / ny2);
     586          16 :                     sal_uInt32 nRestPerStepMul1000 = nSteps ? ( ((ny1 * 1000L)/ nSteps) - (ny2 * 1000L) ) : 0;
     587          16 :                     sal_uInt32 nStepOffset = 0;
     588          16 :                     sal_uInt16 nPointOffset = 0;
     589             : 
     590         123 :                     for(sal_uInt16 a=0;a<nSteps;a++)
     591             :                     {
     592             :                         // draw
     593             :                         rOut.DrawGrid(
     594         107 :                             Rectangle( xBigOrg, yFinOrg + (a * ny2) + nPointOffset, x2, y2 ),
     595         214 :                             Size( nx1, ny1 ), nGridFlags );
     596             : 
     597             :                         // do a step
     598         107 :                         nStepOffset += nRestPerStepMul1000;
     599         244 :                         while(nStepOffset >= 1000)
     600             :                         {
     601          30 :                             nStepOffset -= 1000;
     602          30 :                             nPointOffset++;
     603             :                         }
     604             :                     }
     605             :                 }
     606             :             }
     607             :         }
     608             : 
     609          16 :         rOut.EnableMapMode(bMap0);
     610          16 :         rOut.SetLineColor(aColorMerk);
     611             :     }
     612             : }
     613             : 
     614       19956 : void SdrPageView::AdjHdl()
     615             : {
     616       19956 :     GetView().AdjustMarkHdl();
     617       19956 : }
     618             : 
     619       24520 : void SdrPageView::SetLayer(const OUString& rName, SetOfByte& rBS, bool bJa)
     620             : {
     621       24520 :     if(!GetPage())
     622       24520 :         return;
     623             : 
     624       24520 :     SdrLayerID nID = GetPage()->GetLayerAdmin().GetLayerID(rName, true);
     625             : 
     626       24520 :     if(SDRLAYER_NOTFOUND != nID)
     627       24520 :         rBS.Set(nID, bJa);
     628             : }
     629             : 
     630       10248 : bool SdrPageView::IsLayer(const OUString& rName, const SetOfByte& rBS) const
     631             : {
     632       10248 :     if(!GetPage())
     633           0 :         return false;
     634             : 
     635       10248 :     bool bRet(false);
     636             : 
     637       10248 :     if (!rName.isEmpty())
     638             :     {
     639       10248 :         SdrLayerID nId = GetPage()->GetLayerAdmin().GetLayerID(rName, true);
     640             : 
     641       10248 :         if(SDRLAYER_NOTFOUND != nId)
     642             :         {
     643       10248 :             bRet = rBS.IsSet(nId);
     644             :         }
     645             :     }
     646             : 
     647       10248 :     return bRet;
     648             : }
     649             : 
     650        1450 : bool SdrPageView::IsObjMarkable(SdrObject* pObj) const
     651             : {
     652        1450 :     if(pObj)
     653             :     {
     654             :         // excluded from selection?
     655        1450 :         if(pObj->IsMarkProtect())
     656             :         {
     657           0 :             return false;
     658             :         }
     659             : 
     660             :         // only visible are selectable
     661        1450 :         if( !pObj->IsVisible() )
     662             :         {
     663           0 :             return false;
     664             :         }
     665             : 
     666        1450 :         if(pObj->ISA(SdrObjGroup))
     667             :         {
     668             :             // If object is a Group object, visibility may depend on
     669             :             // multiple layers. If one object is markable, Group is markable.
     670         128 :             SdrObjList* pObjList = static_cast<SdrObjGroup*>(pObj)->GetSubList();
     671             : 
     672         128 :             if(pObjList && pObjList->GetObjCount())
     673             :             {
     674         128 :                 bool bGroupIsMarkable(false);
     675             : 
     676         352 :                 for(size_t a = 0; !bGroupIsMarkable && a < pObjList->GetObjCount(); ++a)
     677             :                 {
     678         224 :                     SdrObject* pCandidate = pObjList->GetObj(a);
     679             : 
     680             :                     // call recursively
     681         224 :                     if(IsObjMarkable(pCandidate))
     682             :                     {
     683         106 :                         bGroupIsMarkable = true;
     684             :                     }
     685             :                 }
     686             : 
     687         128 :                 return bGroupIsMarkable;
     688             :             }
     689             :             else
     690             :             {
     691             :                 // #i43302#
     692             :                 // Allow empty groups to be selected to be able to delete them
     693           0 :                 return true;
     694             :             }
     695             :         }
     696             :         else
     697             :         {
     698             :             // the layer has to be visible and must not be locked
     699        1322 :             SdrLayerID nL = pObj->GetLayer();
     700        1322 :             return (aLayerVisi.IsSet(sal_uInt8(nL)) && !aLayerLock.IsSet(sal_uInt8(nL)));
     701             :         }
     702             :     }
     703             : 
     704           0 :     return false;
     705             : }
     706             : 
     707           0 : void SdrPageView::SetPageOrigin(const Point& rOrg)
     708             : {
     709           0 :     if (rOrg!=aPgOrg) {
     710           0 :         aPgOrg=rOrg;
     711           0 :         if (GetView().IsGridVisible()) {
     712           0 :             InvalidateAllWin();
     713             :         }
     714             :     }
     715           0 : }
     716             : 
     717           0 : void SdrPageView::ImpInvalidateHelpLineArea(sal_uInt16 nNum) const
     718             : {
     719           0 :     if (GetView().IsHlplVisible() && nNum<aHelpLines.GetCount()) {
     720           0 :         const SdrHelpLine& rHL=aHelpLines[nNum];
     721             : 
     722           0 :         for(sal_uInt32 a(0L); a < GetView().PaintWindowCount(); a++)
     723             :         {
     724           0 :             SdrPaintWindow* pCandidate = GetView().GetPaintWindow(a);
     725             : 
     726           0 :             if(pCandidate->OutputToWindow())
     727             :             {
     728           0 :                 OutputDevice& rOutDev = pCandidate->GetOutputDevice();
     729           0 :                 Rectangle aR(rHL.GetBoundRect(rOutDev));
     730           0 :                 Size aSiz(rOutDev.PixelToLogic(Size(1,1)));
     731           0 :                 aR.Left() -= aSiz.Width();
     732           0 :                 aR.Right() += aSiz.Width();
     733           0 :                 aR.Top() -= aSiz.Height();
     734           0 :                 aR.Bottom() += aSiz.Height();
     735           0 :                 ((SdrView&)GetView()).InvalidateOneWin(static_cast<vcl::Window&>(rOutDev), aR);
     736             :             }
     737             :         }
     738             :     }
     739           0 : }
     740             : 
     741         220 : void SdrPageView::SetHelpLines(const SdrHelpLineList& rHLL)
     742             : {
     743         220 :     aHelpLines=rHLL;
     744         220 :     InvalidateAllWin();
     745         220 : }
     746             : 
     747           0 : void SdrPageView::SetHelpLine(sal_uInt16 nNum, const SdrHelpLine& rNewHelpLine)
     748             : {
     749           0 :     if (nNum<aHelpLines.GetCount() && aHelpLines[nNum]!=rNewHelpLine) {
     750           0 :         bool bNeedRedraw = true;
     751           0 :         if (aHelpLines[nNum].GetKind()==rNewHelpLine.GetKind()) {
     752           0 :             switch (rNewHelpLine.GetKind()) {
     753           0 :                 case SDRHELPLINE_VERTICAL  : if (aHelpLines[nNum].GetPos().X()==rNewHelpLine.GetPos().X()) bNeedRedraw = false; break;
     754           0 :                 case SDRHELPLINE_HORIZONTAL: if (aHelpLines[nNum].GetPos().Y()==rNewHelpLine.GetPos().Y()) bNeedRedraw = false; break;
     755           0 :                 default: break;
     756             :             } // switch
     757             :         }
     758           0 :         if (bNeedRedraw) ImpInvalidateHelpLineArea(nNum);
     759           0 :         aHelpLines[nNum]=rNewHelpLine;
     760           0 :         if (bNeedRedraw) ImpInvalidateHelpLineArea(nNum);
     761             :     }
     762           0 : }
     763             : 
     764           0 : void SdrPageView::DeleteHelpLine(sal_uInt16 nNum)
     765             : {
     766           0 :     if (nNum<aHelpLines.GetCount()) {
     767           0 :         ImpInvalidateHelpLineArea(nNum);
     768           0 :         aHelpLines.Delete(nNum);
     769             :     }
     770           0 : }
     771             : 
     772           0 : void SdrPageView::InsertHelpLine(const SdrHelpLine& rHL, sal_uInt16 nNum)
     773             : {
     774           0 :     if (nNum > aHelpLines.GetCount())
     775           0 :         nNum = aHelpLines.GetCount();
     776           0 :     aHelpLines.Insert(rHL,nNum);
     777           0 :     if (GetView().IsHlplVisible())
     778           0 :         ImpInvalidateHelpLineArea(nNum);
     779           0 : }
     780             : 
     781             : // set current group and list
     782        8041 : void SdrPageView::SetAktGroupAndList(SdrObject* pNewGroup, SdrObjList* pNewList)
     783             : {
     784        8041 :     if(pAktGroup != pNewGroup)
     785             :     {
     786           0 :         pAktGroup = pNewGroup;
     787             :     }
     788        8041 :     if(pAktList != pNewList)
     789             :     {
     790        8041 :         pAktList = pNewList;
     791             :     }
     792        8041 : }
     793             : 
     794           0 : bool SdrPageView::EnterGroup(SdrObject* pObj)
     795             : {
     796           0 :     bool bRet(false);
     797             : 
     798           0 :     if(pObj && pObj->IsGroupObject())
     799             :     {
     800           0 :         bool bGlueInvalidate(GetView().ImpIsGlueVisible());
     801             : 
     802           0 :         if(bGlueInvalidate)
     803             :         {
     804           0 :             GetView().GlueInvalidate();
     805             :         }
     806             : 
     807             :         // deselect all
     808           0 :         GetView().UnmarkAll();
     809             : 
     810             :         // set current group and list
     811           0 :         SdrObjList* pNewObjList = pObj->GetSubList();
     812           0 :         SetAktGroupAndList(pObj, pNewObjList);
     813             : 
     814             :         // select contained object if only one object is contained,
     815             :         // else select nothing and let the user decide what to do next
     816           0 :         if(pNewObjList && pNewObjList->GetObjCount() == 1)
     817             :         {
     818           0 :             SdrObject* pFirstObject = pNewObjList->GetObj(0);
     819             : 
     820           0 :             if(GetView().GetSdrPageView())
     821             :             {
     822           0 :                 GetView().MarkObj(pFirstObject, GetView().GetSdrPageView());
     823             :             }
     824             :         }
     825             : 
     826             :         // build new handles
     827           0 :         GetView().AdjustMarkHdl();
     828             : 
     829             :         // invalidate only when view wants to visualize group entering
     830           0 :         if(GetView().DoVisualizeEnteredGroup())
     831             :         {
     832           0 :             InvalidateAllWin();
     833             :         }
     834             : 
     835           0 :         if (bGlueInvalidate)
     836             :         {
     837           0 :             GetView().GlueInvalidate();
     838             :         }
     839             : 
     840           0 :         bRet = true;
     841             :     }
     842             : 
     843           0 :     return bRet;
     844             : }
     845             : 
     846           0 : void SdrPageView::LeaveOneGroup()
     847             : {
     848           0 :     if(GetAktGroup())
     849             :     {
     850           0 :         bool bGlueInvalidate = (GetView().ImpIsGlueVisible());
     851             : 
     852           0 :         if(bGlueInvalidate)
     853           0 :             GetView().GlueInvalidate();
     854             : 
     855           0 :         SdrObject* pLastGroup = GetAktGroup();
     856           0 :         SdrObject* pParentGroup = GetAktGroup()->GetUpGroup();
     857           0 :         SdrObjList* pParentList = GetPage();
     858             : 
     859           0 :         if(pParentGroup)
     860           0 :             pParentList = pParentGroup->GetSubList();
     861             : 
     862             :         // deselect everything
     863           0 :         GetView().UnmarkAll();
     864             : 
     865             :         // allocations, pAktGroup and pAktList need to be set
     866           0 :         SetAktGroupAndList(pParentGroup, pParentList);
     867             : 
     868             :         // select the group we just left
     869           0 :         if(pLastGroup)
     870           0 :             if(GetView().GetSdrPageView())
     871           0 :                 GetView().MarkObj(pLastGroup, GetView().GetSdrPageView());
     872             : 
     873           0 :         GetView().AdjustMarkHdl();
     874             : 
     875             :         // invalidate only if view wants to visualize group entering
     876           0 :         if(GetView().DoVisualizeEnteredGroup())
     877           0 :             InvalidateAllWin();
     878             : 
     879           0 :         if(bGlueInvalidate)
     880           0 :             GetView().GlueInvalidate();
     881             :     }
     882           0 : }
     883             : 
     884           0 : void SdrPageView::LeaveAllGroup()
     885             : {
     886           0 :     if(GetAktGroup())
     887             :     {
     888           0 :         bool bGlueInvalidate = (GetView().ImpIsGlueVisible());
     889             : 
     890           0 :         if(bGlueInvalidate)
     891           0 :             GetView().GlueInvalidate();
     892             : 
     893           0 :         SdrObject* pLastGroup = GetAktGroup();
     894             : 
     895             :         // deselect everything
     896           0 :         GetView().UnmarkAll();
     897             : 
     898             :         // allocations, pAktGroup and pAktList always need to be set
     899           0 :         SetAktGroupAndList(NULL, GetPage());
     900             : 
     901             :         // find and select uppermost group
     902           0 :         if(pLastGroup)
     903             :         {
     904           0 :             while(pLastGroup->GetUpGroup())
     905           0 :                 pLastGroup = pLastGroup->GetUpGroup();
     906             : 
     907           0 :             if(GetView().GetSdrPageView())
     908           0 :                 GetView().MarkObj(pLastGroup, GetView().GetSdrPageView());
     909             :         }
     910             : 
     911           0 :         GetView().AdjustMarkHdl();
     912             : 
     913             :         // invalidate only when view wants to visualize group entering
     914           0 :         if(GetView().DoVisualizeEnteredGroup())
     915           0 :             InvalidateAllWin();
     916             : 
     917           0 :         if(bGlueInvalidate)
     918           0 :             GetView().GlueInvalidate();
     919             :     }
     920           0 : }
     921             : 
     922        4227 : sal_uInt16 SdrPageView::GetEnteredLevel() const
     923             : {
     924        4227 :     sal_uInt16 nAnz=0;
     925        4227 :     SdrObject* pGrp=GetAktGroup();
     926        8454 :     while (pGrp!=NULL) {
     927           0 :         nAnz++;
     928           0 :         pGrp=pGrp->GetUpGroup();
     929             :     }
     930        4227 :     return nAnz;
     931             : }
     932             : 
     933           0 : void SdrPageView::CheckAktGroup()
     934             : {
     935           0 :     SdrObject* pGrp=GetAktGroup();
     936           0 :     while (pGrp!=NULL &&
     937           0 :            (!pGrp->IsInserted() || pGrp->GetObjList()==NULL ||
     938           0 :             pGrp->GetPage()==NULL || pGrp->GetModel()==NULL)) { // anything outside of the borders?
     939           0 :         pGrp=pGrp->GetUpGroup();
     940             :     }
     941           0 :     if (pGrp!=GetAktGroup()) {
     942           0 :         if (pGrp!=NULL) EnterGroup(pGrp);
     943           0 :         else LeaveAllGroup();
     944             :     }
     945           0 : }
     946             : 
     947             : // Set background color for svx at SdrPageViews
     948         716 : void SdrPageView::SetApplicationBackgroundColor(Color aBackgroundColor)
     949             : {
     950         716 :     maBackgroundColor = aBackgroundColor;
     951         716 : }
     952             : 
     953             : 
     954             : // Set document color for svx at SdrPageViews
     955         181 : void SdrPageView::SetApplicationDocumentColor(Color aDocumentColor)
     956             : {
     957         181 :     maDocumentColor = aDocumentColor;
     958         832 : }
     959             : 
     960             : 
     961             : 
     962             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10