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

Generated by: LCOV version 1.10