LCOV - code coverage report
Current view: top level - svx/source/svdraw - svdpntv.cxx (source / functions) Hit Total Coverage
Test: commit c8344322a7af75b84dd3ca8f78b05543a976dfd5 Lines: 364 535 68.0 %
Date: 2015-06-13 12:38:46 Functions: 65 91 71.4 %
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 <memory>
      21             : #include <com/sun/star/awt/XWindow.hpp>
      22             : #include <svx/svdpntv.hxx>
      23             : #include <vcl/msgbox.hxx>
      24             : #include <svx/sdrpaintwindow.hxx>
      25             : #include <svtools/grfmgr.hxx>
      26             : #include <svx/svdmodel.hxx>
      27             : 
      28             : #ifdef DBG_UTIL
      29             : #include <svdibrow.hxx>
      30             : #endif
      31             : #include <svx/svdpage.hxx>
      32             : #include <svx/svdpagv.hxx>
      33             : #include <svl/smplhint.hxx>
      34             : 
      35             : #include <editeng/editdata.hxx>
      36             : #include <svx/svdmrkv.hxx>
      37             : #include <svx/svdundo.hxx>
      38             : #include <svx/svdview.hxx>
      39             : #include <svx/svdglue.hxx>
      40             : #include <svx/svdobj.hxx>
      41             : #include <svx/svdograf.hxx>
      42             : #include "svdibrow.hxx"
      43             : #include "svx/svditer.hxx"
      44             : #include <svx/svdouno.hxx>
      45             : #include <svx/sdr/overlay/overlayobjectlist.hxx>
      46             : #include <sdr/overlay/overlayrollingrectangle.hxx>
      47             : #include <svx/sdr/overlay/overlaymanager.hxx>
      48             : #include <sxlayitm.hxx>
      49             : #include <svl/itemiter.hxx>
      50             : #include <editeng/eeitem.hxx>
      51             : #include <svl/whiter.hxx>
      52             : #include <svl/style.hxx>
      53             : #include <svx/sdrpagewindow.hxx>
      54             : #include <vcl/svapp.hxx>
      55             : #include <com/sun/star/awt/PosSize.hpp>
      56             : #include <com/sun/star/awt/XControl.hpp>
      57             : #include <svx/sdr/contact/objectcontact.hxx>
      58             : #include <svx/sdr/animation/objectanimator.hxx>
      59             : #include <svx/sdr/contact/viewcontact.hxx>
      60             : #include <drawinglayer/primitive2d/metafileprimitive2d.hxx>
      61             : #include <basegfx/matrix/b2dhommatrixtools.hxx>
      62             : 
      63             : using namespace ::com::sun::star;
      64             : 
      65             : 
      66             : // interface to SdrPaintWindow
      67             : 
      68       40704 : SdrPaintWindow* SdrPaintView::FindPaintWindow(const OutputDevice& rOut) const
      69             : {
      70       40712 :     for(SdrPaintWindowVector::const_iterator a = maPaintWindows.begin(); a != maPaintWindows.end(); ++a)
      71             :     {
      72       40712 :         if(&((*a)->GetOutputDevice()) == &rOut)
      73             :         {
      74       40704 :             return *a;
      75             :         }
      76             :     }
      77             : 
      78           0 :     return 0L;
      79             : }
      80             : 
      81       54447 : SdrPaintWindow* SdrPaintView::GetPaintWindow(sal_uInt32 nIndex) const
      82             : {
      83       54447 :     if(nIndex < maPaintWindows.size())
      84             :     {
      85       54447 :         return maPaintWindows[nIndex];
      86             :     }
      87             : 
      88           0 :     return 0L;
      89             : }
      90             : 
      91        4084 : void SdrPaintView::AppendPaintWindow(SdrPaintWindow& rNew)
      92             : {
      93        4084 :     maPaintWindows.push_back(&rNew);
      94        4084 : }
      95             : 
      96         671 : SdrPaintWindow* SdrPaintView::RemovePaintWindow(SdrPaintWindow& rOld)
      97             : {
      98         671 :     SdrPaintWindow* pRetval = 0L;
      99         671 :     const SdrPaintWindowVector::iterator aFindResult = ::std::find(maPaintWindows.begin(), maPaintWindows.end(), &rOld);
     100             : 
     101         671 :     if(aFindResult != maPaintWindows.end())
     102             :     {
     103             :         // remember return value, aFindResult is no longer valid after deletion
     104         671 :         pRetval = *aFindResult;
     105         671 :         maPaintWindows.erase(aFindResult);
     106             :     }
     107             : 
     108         671 :     return pRetval;
     109             : }
     110             : 
     111        1340 : OutputDevice* SdrPaintView::GetFirstOutputDevice() const
     112             : {
     113        1340 :     if(PaintWindowCount())
     114             :     {
     115        1339 :         return &(GetPaintWindow(0)->GetOutputDevice());
     116             :     }
     117             : 
     118           1 :     return 0L;
     119             : }
     120             : 
     121             : 
     122             : 
     123       15715 : SvxViewHint::SvxViewHint (HintType eHintType)
     124       15715 :     : meHintType(eHintType)
     125             : {
     126       15715 : }
     127             : 
     128             : 
     129             : 
     130             : 
     131             : 
     132           0 : BitmapEx convertMetafileToBitmapEx(
     133             :     const GDIMetaFile& rMtf,
     134             :     const basegfx::B2DRange& rTargetRange,
     135             :     const sal_uInt32 nMaximumQuadraticPixels)
     136             : {
     137           0 :     BitmapEx aBitmapEx;
     138             : 
     139           0 :     if(rMtf.GetActionSize())
     140             :     {
     141             :         const drawinglayer::primitive2d::Primitive2DReference aMtf(
     142             :             new drawinglayer::primitive2d::MetafilePrimitive2D(
     143             :                 basegfx::tools::createScaleTranslateB2DHomMatrix(
     144             :                     rTargetRange.getRange(),
     145             :                     rTargetRange.getMinimum()),
     146           0 :                 rMtf));
     147           0 :         aBitmapEx = convertPrimitive2DSequenceToBitmapEx(
     148             :             drawinglayer::primitive2d::Primitive2DSequence(&aMtf, 1),
     149             :             rTargetRange,
     150           0 :             nMaximumQuadraticPixels);
     151             :     }
     152             : 
     153           0 :     return aBitmapEx;
     154             : }
     155             : 
     156             : 
     157             : 
     158           0 : TYPEINIT2(SdrPaintView,SfxListener,SfxRepeatTarget);
     159             : 
     160             : 
     161        9504 : void SdrPaintView::ImpClearVars()
     162             : {
     163             : #ifdef DBG_UTIL
     164             :     pItemBrowser=NULL;
     165             : #endif
     166        9504 :     bPageVisible=true;
     167        9504 :     bPageBorderVisible=true;
     168        9504 :     bBordVisible=true;
     169        9504 :     bGridVisible=true;
     170        9504 :     bGridFront  =false;
     171        9504 :     bHlplVisible=true;
     172        9504 :     bHlplFront  =true;
     173        9504 :     bGlueVisible=false;
     174        9504 :     bGlueVisible2=false;
     175        9504 :     bGlueVisible3=false;
     176        9504 :     bGlueVisible4=false;
     177        9504 :     bSwapAsynchron=false;
     178        9504 :     bPrintPreview=false;
     179        9504 :     mbPreviewRenderer=false;
     180             : 
     181        9504 :     eAnimationMode = SDR_ANIMATION_ANIMATE;
     182        9504 :     bAnimationPause = false;
     183             : 
     184        9504 :     nHitTolPix=2;
     185        9504 :     nMinMovPix=3;
     186        9504 :     nHitTolLog=0;
     187        9504 :     nMinMovLog=0;
     188        9504 :     pActualOutDev=NULL;
     189        9504 :     pDragWin=NULL;
     190        9504 :     bRestoreColors=true;
     191        9504 :     pDefaultStyleSheet=NULL;
     192        9504 :     bSomeObjChgdFlag=false;
     193        9504 :     nGraphicManagerDrawMode = GraphicManagerDrawFlags::STANDARD;
     194        9504 :     aComeBackIdle.SetPriority(SchedulerPriority::REPAINT);
     195        9504 :     aComeBackIdle.SetIdleHdl(LINK(this,SdrPaintView,ImpComeBackHdl));
     196             : 
     197        9504 :     if (pMod)
     198        9504 :         SetDefaultStyleSheet(pMod->GetDefaultStyleSheet(), true);
     199             : 
     200        9504 :     maGridColor = Color( COL_BLACK );
     201        9504 : }
     202             : 
     203        9504 : SdrPaintView::SdrPaintView(SdrModel* pModel1, OutputDevice* pOut)
     204             : :   mpPageView(NULL),
     205        9504 :     aDefaultAttr(pModel1->GetItemPool()),
     206             :     mbBufferedOutputAllowed(false),
     207             :     mbBufferedOverlayAllowed(false),
     208             :     mbPagePaintingAllowed(true),
     209             :     mbHideOle(false),
     210             :     mbHideChart(false),
     211             :     mbHideDraw(false),
     212       19008 :     mbHideFormControl(false)
     213             : {
     214        9504 :     pMod=pModel1;
     215        9504 :     ImpClearVars();
     216             : 
     217        9504 :     if(pOut)
     218             :     {
     219        4081 :         AddWindowToPaintView(pOut);
     220             :     }
     221             : 
     222             :     // flag to visualize groups
     223        9504 :     bVisualizeEnteredGroup = true;
     224             : 
     225        9504 :     maColorConfig.AddListener(this);
     226        9504 :     onChangeColorConfig();
     227        9504 : }
     228             : 
     229       18876 : SdrPaintView::~SdrPaintView()
     230             : {
     231        9438 :     if (pDefaultStyleSheet)
     232        1832 :         EndListening(*pDefaultStyleSheet);
     233             : 
     234        9438 :     maColorConfig.RemoveListener(this);
     235        9438 :     ClearPageView();
     236             : 
     237             : #ifdef DBG_UTIL
     238             :     pItemBrowser.disposeAndClear();
     239             : #endif
     240             : 
     241             :     // delete existing SdrPaintWindows
     242       22266 :     while(!maPaintWindows.empty())
     243             :     {
     244        3390 :         delete maPaintWindows.back();
     245        3390 :         maPaintWindows.pop_back();
     246             :     }
     247        9438 : }
     248             : 
     249             : 
     250             : 
     251      342865 : void SdrPaintView::Notify(SfxBroadcaster& rBC, const SfxHint& rHint)
     252             : {
     253             :     //If the stylesheet has been destroyed
     254      342865 :     if (&rBC == pDefaultStyleSheet)
     255             :     {
     256        8223 :         const SfxSimpleHint* pSimpleHint = dynamic_cast<const SfxSimpleHint*>(&rHint);
     257        8223 :         if (pSimpleHint && pSimpleHint->GetId() == SFX_HINT_DYING)
     258           0 :             pDefaultStyleSheet = NULL;
     259      351088 :         return;
     260             :     }
     261             : 
     262      334642 :     bool bObjChg=!bSomeObjChgdFlag; // if true, evaluate for ComeBack timer
     263      334642 :     if (bObjChg) {
     264       12576 :         const SdrHint* pSdrHint = dynamic_cast<const SdrHint*>(&rHint);
     265       12576 :         if (pSdrHint) {
     266       12116 :             SdrHintKind eKind=pSdrHint->GetKind();
     267       12116 :             if (eKind==HINT_OBJCHG || eKind==HINT_OBJINSERTED || eKind==HINT_OBJREMOVED) {
     268        7137 :                 if (bObjChg) {
     269        7137 :                     bSomeObjChgdFlag=true;
     270        7137 :                     aComeBackIdle.Start();
     271             :                 }
     272             :             }
     273       12116 :             if (eKind==HINT_PAGEORDERCHG) {
     274        4319 :                 const SdrPage* pPg=pSdrHint->GetPage();
     275             : 
     276        4319 :                 if(pPg && !pPg->IsInserted())
     277             :                 {
     278        1167 :                     if(mpPageView && mpPageView->GetPage() == pPg)
     279             :                     {
     280           0 :                         HideSdrPage();
     281             :                     }
     282             :                 }
     283             :             }
     284             :         }
     285             :     }
     286             : }
     287             : 
     288         165 : void SdrPaintView::ConfigurationChanged( ::utl::ConfigurationBroadcaster* , sal_uInt32 )
     289             : {
     290         165 :     onChangeColorConfig();
     291         165 :     InvalidateAllWin();
     292         165 : }
     293             : 
     294             : 
     295             : 
     296        6540 : IMPL_LINK_NOARG_TYPED(SdrPaintView, ImpComeBackHdl, Idle *, void)
     297             : {
     298        3803 :     if (bSomeObjChgdFlag) {
     299        3803 :         bSomeObjChgdFlag=false;
     300        3803 :         ModelHasChanged();
     301             :     }
     302        3803 : }
     303             : 
     304        1066 : void SdrPaintView::FlushComeBackTimer() const
     305             : {
     306        1066 :     if (bSomeObjChgdFlag) {
     307             :         // casting to nonconst
     308        1066 :         const_cast<SdrPaintView*>(this)->ImpComeBackHdl(&const_cast<SdrPaintView*>(this)->aComeBackIdle);
     309        1066 :         const_cast<SdrPaintView*>(this)->aComeBackIdle.Stop();
     310             :     }
     311        1066 : }
     312             : 
     313        3699 : void SdrPaintView::ModelHasChanged()
     314             : {
     315             :     // broadcast to all PageViews
     316        3699 :     if(mpPageView && !mpPageView->GetPage()->IsInserted())
     317             :     {
     318           0 :         HideSdrPage();
     319             :     }
     320             : 
     321             :     // test mpPageView here again, HideSdrPage() may have invalidated it.
     322        3699 :     if(mpPageView)
     323             :     {
     324        1542 :         mpPageView->ModelHasChanged();
     325             :     }
     326             : 
     327             : #ifdef DBG_UTIL
     328             :     if(pItemBrowser)
     329             :     {
     330             :         pItemBrowser->SetDirty();
     331             :     }
     332             : #endif
     333        3699 : }
     334             : 
     335             : 
     336             : 
     337        1876 : bool SdrPaintView::IsAction() const
     338             : {
     339        1876 :     return false;
     340             : }
     341             : 
     342           2 : void SdrPaintView::MovAction(const Point&)
     343             : {
     344           2 : }
     345             : 
     346           0 : void SdrPaintView::EndAction()
     347             : {
     348           0 : }
     349             : 
     350           0 : void SdrPaintView::BckAction()
     351             : {
     352           0 : }
     353             : 
     354       15422 : void SdrPaintView::BrkAction()
     355             : {
     356       15422 : }
     357             : 
     358           0 : void SdrPaintView::TakeActionRect(Rectangle&) const
     359             : {
     360           0 : }
     361             : 
     362             : 
     363             : // info about TextEdit. Default is false.
     364           0 : bool SdrPaintView::IsTextEdit() const
     365             : {
     366           0 :     return false;
     367             : }
     368             : 
     369             : // info about TextEditPageView. Default is 0L.
     370           0 : SdrPageView* SdrPaintView::GetTextEditPageView() const
     371             : {
     372           0 :     return 0L;
     373             : }
     374             : 
     375             : 
     376             : 
     377           2 : sal_uInt16 SdrPaintView::ImpGetMinMovLogic(short nMinMov, const OutputDevice* pOut) const
     378             : {
     379           2 :     if (nMinMov>=0) return sal_uInt16(nMinMov);
     380           1 :     if (pOut==NULL)
     381             :     {
     382           1 :         pOut = GetFirstOutputDevice();
     383             :     }
     384           1 :     if (pOut!=NULL) {
     385           1 :         return short(-pOut->PixelToLogic(Size(nMinMov,0)).Width());
     386             :     } else {
     387           0 :         return 0;
     388             :     }
     389             : }
     390             : 
     391          15 : sal_uInt16 SdrPaintView::ImpGetHitTolLogic(short nHitTol, const OutputDevice* pOut) const
     392             : {
     393          15 :     if (nHitTol>=0) return sal_uInt16(nHitTol);
     394           0 :     if (pOut==NULL)
     395             :     {
     396           0 :         pOut = GetFirstOutputDevice();
     397             :     }
     398           0 :     if (pOut!=NULL) {
     399           0 :         return short(-pOut->PixelToLogic(Size(nHitTol,0)).Width());
     400             :     } else {
     401           0 :         return 0;
     402             :     }
     403             : }
     404             : 
     405       25232 : void SdrPaintView::TheresNewMapMode()
     406             : {
     407       25232 :     if (pActualOutDev) {
     408       20781 :         nHitTolLog=(sal_uInt16)pActualOutDev->PixelToLogic(Size(nHitTolPix,0)).Width();
     409       20781 :         nMinMovLog=(sal_uInt16)pActualOutDev->PixelToLogic(Size(nMinMovPix,0)).Width();
     410             :     }
     411       25232 : }
     412             : 
     413       14149 : void SdrPaintView::SetActualWin(const OutputDevice* pWin)
     414             : {
     415       14149 :     pActualOutDev = const_cast<OutputDevice *>(pWin);
     416       14149 :     TheresNewMapMode();
     417       14149 : }
     418             : 
     419             : 
     420             : 
     421        9438 : void SdrPaintView::ClearPageView()
     422             : {
     423        9438 :     BrkAction();
     424             : 
     425        9438 :     if(mpPageView)
     426             :     {
     427         477 :         InvalidateAllWin();
     428         477 :         delete mpPageView;
     429         477 :         mpPageView = 0L;
     430             :     }
     431        9438 : }
     432             : 
     433        5528 : SdrPageView* SdrPaintView::ShowSdrPage(SdrPage* pPage)
     434             : {
     435        5528 :     if(pPage && (!mpPageView || mpPageView->GetPage() != pPage))
     436             :     {
     437        5528 :         if(mpPageView)
     438             :         {
     439           0 :             InvalidateAllWin();
     440           0 :             delete mpPageView;
     441             :         }
     442             : 
     443        5528 :         mpPageView = new SdrPageView(pPage, *static_cast<SdrView*>(this));
     444        5528 :         mpPageView->Show();
     445             :     }
     446             : 
     447        5528 :     return mpPageView;
     448             : }
     449             : 
     450        5243 : void SdrPaintView::HideSdrPage()
     451             : {
     452        5243 :     if(mpPageView)
     453             :     {
     454        5029 :         mpPageView->Hide();
     455        5029 :         delete mpPageView;
     456        5029 :         mpPageView = 0L;
     457             :     }
     458        5243 : }
     459             : 
     460        4084 : void SdrPaintView::AddWindowToPaintView(OutputDevice* pNewWin)
     461             : {
     462             :     DBG_ASSERT(pNewWin, "SdrPaintView::AddWindowToPaintView: No OutputDevice(!)");
     463        4084 :     SdrPaintWindow* pNewPaintWindow = new SdrPaintWindow(*this, *pNewWin);
     464        4084 :     AppendPaintWindow(*pNewPaintWindow);
     465             : 
     466        4084 :     if(mpPageView)
     467             :     {
     468           3 :         mpPageView->AddPaintWindowToPageView(*pNewPaintWindow);
     469             :     }
     470             : 
     471             : #ifdef DBG_UTIL
     472             :     if (pItemBrowser!=nullptr)
     473             :         pItemBrowser->ForceParent();
     474             : #endif
     475        4084 : }
     476             : 
     477         671 : void SdrPaintView::DeleteWindowFromPaintView(OutputDevice* pOldWin)
     478             : {
     479             :     assert(pOldWin && "SdrPaintView::DeleteWindowFromPaintView: No OutputDevice(!)");
     480         671 :     SdrPaintWindow* pCandidate = FindPaintWindow(*pOldWin);
     481             : 
     482         671 :     if(pCandidate)
     483             :     {
     484         671 :         if(mpPageView)
     485             :         {
     486         547 :             mpPageView->RemovePaintWindowFromPageView(*pCandidate);
     487             :         }
     488             : 
     489         671 :         RemovePaintWindow(*pCandidate);
     490         671 :         delete pCandidate;
     491             :     }
     492             : 
     493             : #ifdef DBG_UTIL
     494             :     if (pItemBrowser!=nullptr)
     495             :         pItemBrowser->ForceParent();
     496             : #endif
     497         671 : }
     498             : 
     499         977 : void SdrPaintView::SetLayerVisible(const OUString& rName, bool bShow)
     500             : {
     501         977 :     if(mpPageView)
     502             :     {
     503         977 :         mpPageView->SetLayerVisible(rName, bShow);
     504             :     }
     505             : 
     506         977 :     InvalidateAllWin();
     507         977 : }
     508             : 
     509           0 : bool SdrPaintView::IsLayerVisible(const OUString& rName) const
     510             : {
     511           0 :     if(mpPageView)
     512             :     {
     513           0 :         return mpPageView->IsLayerVisible(rName);
     514             :     }
     515             : 
     516           0 :     return false;
     517             : }
     518             : 
     519        4887 : void SdrPaintView::SetLayerLocked(const OUString& rName, bool bLock)
     520             : {
     521        4887 :     if(mpPageView)
     522             :     {
     523        4885 :         mpPageView->SetLayerLocked(rName,bLock);
     524             :     }
     525        4887 : }
     526             : 
     527           6 : bool SdrPaintView::IsLayerLocked(const OUString& rName) const
     528             : {
     529           6 :     if(mpPageView)
     530             :     {
     531           4 :         return mpPageView->IsLayerLocked(rName);
     532             :     }
     533             : 
     534           2 :     return false;
     535             : }
     536             : 
     537         349 : void SdrPaintView::SetLayerPrintable(const OUString& rName, bool bPrn)
     538             : {
     539         349 :     if(mpPageView)
     540             :     {
     541         349 :         mpPageView->SetLayerPrintable(rName,bPrn);
     542             :     }
     543         349 : }
     544             : 
     545           1 : bool SdrPaintView::IsLayerPrintable(const OUString& rName) const
     546             : {
     547           1 :     if(mpPageView)
     548             :     {
     549           1 :         return mpPageView->IsLayerPrintable(rName);
     550             :     }
     551             : 
     552           0 :     return false;
     553             : }
     554             : 
     555       34709 : void SdrPaintView::PrePaint()
     556             : {
     557       34709 :     if(mpPageView)
     558             :     {
     559       34705 :         mpPageView->PrePaint();
     560             :     }
     561       34709 : }
     562             : 
     563             : 
     564             : // #define SVX_REPAINT_TIMER_TEST
     565             : 
     566        1904 : void SdrPaintView::CompleteRedraw(OutputDevice* pOut, const vcl::Region& rReg, sdr::contact::ViewObjectContactRedirector* pRedirector)
     567             : {
     568             : #ifdef SVX_REPAINT_TIMER_TEST
     569             : #define REMEMBERED_TIMES_COUNT  (10)
     570             :     static bool bDoTimerTest(false);
     571             :     static bool bTimesInited(false);
     572             :     static sal_uInt32 nRepeatCount(10L);
     573             :     static double fLastTimes[REMEMBERED_TIMES_COUNT];
     574             :     const sal_uInt64 nStartTime(tools::Time::GetSystemTicks());
     575             :     sal_uInt32 count(1L);
     576             :     sal_uInt32 a;
     577             : 
     578             :     if(bDoTimerTest)
     579             :     {
     580             :         count = nRepeatCount;
     581             :     }
     582             : 
     583             :     for(a = 0L; a < count; a++)
     584             :     {
     585             : #endif // SVX_REPAINT_TIMER_TEST
     586             : 
     587             :     // #i74769# check if pOut is a win and has a ClipRegion. If Yes, the Region
     588             :     // rReg may be made more granular (fine) with using it. Normally, rReg
     589             :     // does come from Window::Paint() anyways and thus is based on a single
     590             :     // rectangle which was derived from exactly that repaint region
     591        1904 :     vcl::Region aOptimizedRepaintRegion(rReg);
     592             : 
     593        1904 :     if(pOut && OUTDEV_WINDOW == pOut->GetOutDevType())
     594             :     {
     595        1687 :         vcl::Window* pWindow = static_cast<vcl::Window*>(pOut);
     596             : 
     597        1687 :         if(pWindow->IsInPaint())
     598             :         {
     599        1687 :             if(!pWindow->GetPaintRegion().IsEmpty())
     600             :             {
     601        1687 :                 aOptimizedRepaintRegion.Intersect(pWindow->GetPaintRegion());
     602             : 
     603             : #ifdef DBG_UTIL
     604             :                 // #i74769# test-paint repaint region
     605             :                 static bool bDoPaintForVisualControl(false);
     606             : 
     607             :                 if(bDoPaintForVisualControl)
     608             :                 {
     609             :                     RectangleVector aRectangles;
     610             :                     aOptimizedRepaintRegion.GetRegionRectangles(aRectangles);
     611             : 
     612             :                     pWindow->SetLineColor(COL_LIGHTGREEN);
     613             :                     pWindow->SetFillColor();
     614             : 
     615             :                     for(RectangleVector::const_iterator aRectIter(aRectangles.begin()); aRectIter != aRectangles.end(); ++aRectIter)
     616             :                     {
     617             :                         pWindow->DrawRect(*aRectIter);
     618             :                     }
     619             : 
     620             :                     //RegionHandle aRegionHandle(aOptimizedRepaintRegion.BeginEnumRects());
     621             :                     //Rectangle aRegionRectangle;
     622             : 
     623             :                     //while(aOptimizedRepaintRegion.GetEnumRects(aRegionHandle, aRegionRectangle))
     624             :                     //{
     625             :                     //  pWindow->SetLineColor(COL_LIGHTGREEN);
     626             :                     //  pWindow->SetFillColor();
     627             :                     //  pWindow->DrawRect(aRegionRectangle);
     628             :                     //}
     629             : 
     630             :                     //aOptimizedRepaintRegion.EndEnumRects(aRegionHandle);
     631             :                 }
     632             : #endif
     633             :             }
     634             :         }
     635             :     }
     636             : 
     637        1904 :     SdrPaintWindow* pPaintWindow = BeginCompleteRedraw(pOut);
     638             :     OSL_ENSURE(pPaintWindow, "SdrPaintView::CompleteRedraw: No OutDev (!)");
     639             : 
     640        1904 :     DoCompleteRedraw(*pPaintWindow, aOptimizedRepaintRegion, pRedirector);
     641        1904 :     EndCompleteRedraw(*pPaintWindow, true);
     642             : 
     643             : #ifdef SVX_REPAINT_TIMER_TEST
     644             :     }
     645             : 
     646             :     if(bDoTimerTest)
     647             :     {
     648             :         const sal_uInt64 nStopTime(tools::Time::GetSystemTicks());
     649             :         const sal_uInt64 nNeededTime(nStopTime - nStartTime);
     650             :         const double fTimePerPaint((double)nNeededTime / (double)nRepeatCount);
     651             : 
     652             :         if(!bTimesInited)
     653             :         {
     654             :             for(a = 0L; a < REMEMBERED_TIMES_COUNT; a++)
     655             :             {
     656             :                 fLastTimes[a] = fTimePerPaint;
     657             :             }
     658             : 
     659             :             bTimesInited = true;
     660             :         }
     661             :         else
     662             :         {
     663             :             for(a = 1L; a < REMEMBERED_TIMES_COUNT; a++)
     664             :             {
     665             :                 fLastTimes[a - 1L] = fLastTimes[a];
     666             :             }
     667             : 
     668             :             fLastTimes[REMEMBERED_TIMES_COUNT - 1L] = fTimePerPaint;
     669             :         }
     670             : 
     671             :         double fAddedTimes(0.0);
     672             : 
     673             :         for(a = 0L; a < REMEMBERED_TIMES_COUNT; a++)
     674             :         {
     675             :             fAddedTimes += fLastTimes[a];
     676             :         }
     677             : 
     678             :         const double fAverageTimePerPaint(fAddedTimes / (double)REMEMBERED_TIMES_COUNT);
     679             : 
     680             :         fprintf(stderr, "-----------(start result)----------\n");
     681             :         fprintf(stderr, "StartTime : %" SAL_PRIuUINT64 ", StopTime: %" SAL_PRIuUINT64 ", NeededTime: %" SAL_PRIuUINT64 ", TimePerPaint: %f\n", nStartTime, nStopTime, nNeededTime, fTimePerPaint);
     682             :         fprintf(stderr, "Remembered times: ");
     683             : 
     684             :         for(a = 0L; a < REMEMBERED_TIMES_COUNT; a++)
     685             :         {
     686             :             fprintf(stderr, "%d: %f ", a, fLastTimes[a]);
     687             :         }
     688             : 
     689             :         fprintf(stderr, "\n");
     690             :         fprintf(stderr, "AverageTimePerPaint: %f\n", fAverageTimePerPaint);
     691             :         fprintf(stderr, "-----------(stop result)----------\n");
     692             :     }
     693             : #endif // SVX_REPAINT_TIMER_TEST
     694        1904 : }
     695             : 
     696             : 
     697             : // #i72889#
     698             : 
     699       14343 : SdrPaintWindow* SdrPaintView::BeginCompleteRedraw(OutputDevice* pOut)
     700             : {
     701             :     OSL_ENSURE(pOut, "SdrPaintView::BeginCompleteRedraw: No OutDev (!)");
     702       14343 :     SdrPaintWindow* pPaintWindow = FindPaintWindow(*pOut);
     703             : 
     704       14343 :     if(pPaintWindow)
     705             :     {
     706             :         // draw preprocessing, only for known devices
     707             :         // prepare PreRendering
     708       14343 :         pPaintWindow->PreparePreRenderDevice();
     709             :     }
     710             :     else
     711             :     {
     712             :         // None of the known OutputDevices is the target of this paint, use
     713             :         // a temporary SdrPaintWindow for this Redraw.
     714           0 :         pPaintWindow = new SdrPaintWindow(*this, *pOut);
     715           0 :         pPaintWindow->setTemporaryTarget(true);
     716             :     }
     717             : 
     718       14343 :     return pPaintWindow;
     719             : }
     720             : 
     721        1904 : void SdrPaintView::DoCompleteRedraw(SdrPaintWindow& rPaintWindow, const vcl::Region& rReg, sdr::contact::ViewObjectContactRedirector* pRedirector)
     722             : {
     723             :     // redraw all PageViews with the target. This may expand the RedrawRegion
     724             :     // at the PaintWindow, plus taking care of FormLayer expansion
     725        1904 :     if(mpPageView)
     726             :     {
     727        1902 :         mpPageView->CompleteRedraw(rPaintWindow, rReg, pRedirector);
     728             :     }
     729        1904 : }
     730             : 
     731       14343 : void SdrPaintView::EndCompleteRedraw(SdrPaintWindow& rPaintWindow, bool bPaintFormLayer)
     732             : {
     733       14343 :     std::unique_ptr<SdrPaintWindow> pPaintWindow;
     734       14343 :     if (GetModel()->isTiledRendering() && rPaintWindow.getTemporaryTarget())
     735             :     {
     736             :         // Tiled rendering, we must paint the TextEdit to the output device.
     737           0 :         pPaintWindow.reset(&rPaintWindow);
     738           0 :         pPaintWindow->setTemporaryTarget(false);
     739             :     }
     740             : 
     741       14343 :     if(rPaintWindow.getTemporaryTarget())
     742             :     {
     743             :         // get rid of temp target again
     744           0 :         delete (&rPaintWindow);
     745             :     }
     746             :     else
     747             :     {
     748             :         // draw postprocessing, only for known devices
     749             :         // it is necessary to always paint FormLayer
     750       14343 :         if(bPaintFormLayer)
     751             :         {
     752       14343 :             ImpFormLayerDrawing(rPaintWindow);
     753             :         }
     754             : 
     755             :         // look for active TextEdit. As long as this cannot be painted to a VDev,
     756             :         // it cannot get part of buffering. In that case, output evtl. prerender
     757             :         // early and paint text edit to window.
     758       14343 :         if(IsTextEdit() && GetSdrPageView())
     759             :         {
     760           0 :             static_cast< SdrView* >(this)->TextEditDrawing(rPaintWindow);
     761             :         }
     762             : 
     763             :         // draw Overlay, also to PreRender device if exists
     764       14343 :         rPaintWindow.DrawOverlay(rPaintWindow.GetRedrawRegion());
     765             : 
     766             :         // output PreRendering
     767       14343 :         rPaintWindow.OutputPreRenderDevice(rPaintWindow.GetRedrawRegion());
     768       14343 :     }
     769       14343 : }
     770             : 
     771             : 
     772             : 
     773       12439 : SdrPaintWindow* SdrPaintView::BeginDrawLayers(OutputDevice* pOut, const vcl::Region& rReg, bool bDisableIntersect)
     774             : {
     775             :     // #i74769# use BeginCompleteRedraw() as common base
     776       12439 :     SdrPaintWindow* pPaintWindow = BeginCompleteRedraw(pOut);
     777             :     OSL_ENSURE(pPaintWindow, "SdrPaintView::BeginDrawLayers: No SdrPaintWindow (!)");
     778             : 
     779       12439 :     if(mpPageView)
     780             :     {
     781       12439 :         SdrPageWindow* pKnownTarget = mpPageView->FindPageWindow(*pPaintWindow);
     782             : 
     783       12439 :         if(pKnownTarget)
     784             :         {
     785       12439 :             vcl::Region aOptimizedRepaintRegion = OptimizeDrawLayersRegion( pOut, rReg, bDisableIntersect );
     786             : 
     787             :             // prepare redraw
     788       12439 :             pKnownTarget->PrepareRedraw(aOptimizedRepaintRegion);
     789             : 
     790             :             // remember prepared SdrPageWindow
     791       12439 :             mpPageView->setPreparedPageWindow(pKnownTarget);
     792             :         }
     793             :     }
     794             : 
     795       12439 :     return pPaintWindow;
     796             : }
     797             : 
     798       12439 : void SdrPaintView::EndDrawLayers(SdrPaintWindow& rPaintWindow, bool bPaintFormLayer)
     799             : {
     800             :     // #i74769# use EndCompleteRedraw() as common base
     801       12439 :     EndCompleteRedraw(rPaintWindow, bPaintFormLayer);
     802             : 
     803       12439 :     if(mpPageView)
     804             :     {
     805             :         // forget prepared SdrPageWindow
     806       12439 :         mpPageView->setPreparedPageWindow(0);
     807             :     }
     808       12439 : }
     809             : 
     810       25690 : void SdrPaintView::UpdateDrawLayersRegion(OutputDevice* pOut, const vcl::Region& rReg, bool bDisableIntersect)
     811             : {
     812       25690 :     SdrPaintWindow* pPaintWindow = FindPaintWindow(*pOut);
     813             :     OSL_ENSURE(pPaintWindow, "SdrPaintView::UpdateDrawLayersRegion: No SdrPaintWindow (!)");
     814             : 
     815       25690 :     if(mpPageView)
     816             :     {
     817       25690 :         SdrPageWindow* pKnownTarget = mpPageView->FindPageWindow(*pPaintWindow);
     818             : 
     819       25690 :         if(pKnownTarget)
     820             :         {
     821       25690 :             vcl::Region aOptimizedRepaintRegion = OptimizeDrawLayersRegion( pOut, rReg, bDisableIntersect );
     822       25690 :             pKnownTarget->GetPaintWindow().SetRedrawRegion(aOptimizedRepaintRegion);
     823       25690 :             mpPageView->setPreparedPageWindow(pKnownTarget); // already set actually
     824             :         }
     825             :     }
     826       25690 : }
     827             : 
     828       38129 : vcl::Region SdrPaintView::OptimizeDrawLayersRegion(OutputDevice* pOut, const vcl::Region& rReg, bool bDisableIntersect)
     829             : {
     830             :     // #i74769# check if pOut is a win and has a ClipRegion. If Yes, the Region
     831             :     // rReg may be made more granular (fine) with using it. Normally, rReg
     832             :     // does come from Window::Paint() anyways and thus is based on a single
     833             :     // rectangle which was derived from exactly that repaint region
     834       38129 :     vcl::Region aOptimizedRepaintRegion(rReg);
     835             : 
     836             :     // #i76114# Intersecting the region with the Window's paint region is disabled
     837             :     // for print preview in Calc, because the intersection can be empty (if the paint
     838             :     // region is outside of the table area of the page), and then no clip region
     839             :     // would be set.
     840       38129 :     if(pOut && OUTDEV_WINDOW == pOut->GetOutDevType() && !bDisableIntersect)
     841             :     {
     842       37754 :         vcl::Window* pWindow = static_cast<vcl::Window*>(pOut);
     843             : 
     844       37754 :         if(pWindow->IsInPaint())
     845             :         {
     846       19963 :             if(!pWindow->GetPaintRegion().IsEmpty())
     847             :             {
     848       19963 :                 aOptimizedRepaintRegion.Intersect(pWindow->GetPaintRegion());
     849             :             }
     850             :         }
     851             :     }
     852       38129 :     return aOptimizedRepaintRegion;
     853             : }
     854             : 
     855             : 
     856             : 
     857       14343 : void SdrPaintView::ImpFormLayerDrawing( SdrPaintWindow& rPaintWindow )
     858             : {
     859       14343 :     if(mpPageView)
     860             :     {
     861       14341 :         SdrPageWindow* pKnownTarget = mpPageView->FindPageWindow(rPaintWindow);
     862             : 
     863       14341 :         if(pKnownTarget)
     864             :         {
     865       14341 :             const SdrModel& rModel = *(GetModel());
     866       14341 :             const SdrLayerAdmin& rLayerAdmin = rModel.GetLayerAdmin();
     867       14341 :             const SdrLayerID nControlLayerId = rLayerAdmin.GetLayerID(rLayerAdmin.GetControlLayerName(), false);
     868             : 
     869             :             // BUFFERED use GetTargetOutputDevice() now, it may be targeted to VDevs, too
     870             :             // need to set PreparedPageWindow to make DrawLayer use the correct ObjectContact
     871       14341 :             mpPageView->setPreparedPageWindow(pKnownTarget);
     872       14341 :             mpPageView->DrawLayer(nControlLayerId, &rPaintWindow.GetTargetOutputDevice());
     873       14341 :             mpPageView->setPreparedPageWindow(0);
     874             :         }
     875             :     }
     876       14343 : }
     877             : 
     878             : 
     879             : 
     880           1 : bool SdrPaintView::KeyInput(const KeyEvent& /*rKEvt*/, vcl::Window* /*pWin*/)
     881             : {
     882           1 :     return false;
     883             : }
     884             : 
     885           0 : void SdrPaintView::GlueInvalidate() const
     886             : {
     887           0 :     const sal_uInt32 nWindowCount(PaintWindowCount());
     888             : 
     889           0 :     for(sal_uInt32 nWinNum(0L); nWinNum < nWindowCount; nWinNum++)
     890             :     {
     891           0 :         SdrPaintWindow* pPaintWindow = GetPaintWindow(nWinNum);
     892             : 
     893           0 :         if(pPaintWindow->OutputToWindow())
     894             :         {
     895           0 :             OutputDevice& rOutDev = pPaintWindow->GetOutputDevice();
     896             : 
     897           0 :             if(mpPageView)
     898             :             {
     899           0 :                 const SdrObjList* pOL=mpPageView->GetObjList();
     900           0 :                 const size_t nObjCount = pOL->GetObjCount();
     901           0 :                 for (size_t nObjNum=0; nObjNum<nObjCount; ++nObjNum) {
     902           0 :                     const SdrObject* pObj=pOL->GetObj(nObjNum);
     903           0 :                     const SdrGluePointList* pGPL=pObj->GetGluePointList();
     904           0 :                     if (pGPL!=NULL && pGPL->GetCount()!=0) {
     905           0 :                         pGPL->Invalidate(static_cast<vcl::Window&>(rOutDev), pObj);
     906             :                     }
     907             :                 }
     908             :             }
     909             :         }
     910             :     }
     911           0 : }
     912             : 
     913       23051 : void SdrPaintView::InvalidateAllWin()
     914             : {
     915       23051 :     const sal_uInt32 nWindowCount(PaintWindowCount());
     916             : 
     917       42256 :     for(sal_uInt32 a(0L); a < nWindowCount; a++)
     918             :     {
     919       19205 :         SdrPaintWindow* pPaintWindow = GetPaintWindow(a);
     920             : 
     921       19205 :         if(pPaintWindow->OutputToWindow())
     922             :         {
     923       16069 :             InvalidateOneWin(static_cast<vcl::Window&>(pPaintWindow->GetOutputDevice()));
     924             :         }
     925             :     }
     926       23051 : }
     927             : 
     928       21161 : void SdrPaintView::InvalidateAllWin(const Rectangle& rRect, bool bPlus1Pix)
     929             : {
     930       21161 :     const sal_uInt32 nWindowCount(PaintWindowCount());
     931             : 
     932       41877 :     for(sal_uInt32 a(0L); a < nWindowCount; a++)
     933             :     {
     934       20716 :         SdrPaintWindow* pPaintWindow = GetPaintWindow(a);
     935             : 
     936       20716 :         if(pPaintWindow->OutputToWindow())
     937             :         {
     938       18339 :             OutputDevice& rOutDev = pPaintWindow->GetOutputDevice();
     939       18339 :             Rectangle aRect(rRect);
     940             : 
     941       18339 :             if(bPlus1Pix)
     942             :             {
     943           0 :                 Size aPixSiz(1,1);
     944           0 :                 Size aSiz(rOutDev.PixelToLogic(aPixSiz));
     945           0 :                 aRect.Left  ()-=aSiz.Width();
     946           0 :                 aRect.Top   ()-=aSiz.Height();
     947           0 :                 aRect.Right ()+=aSiz.Width();
     948           0 :                 aRect.Bottom()+=aSiz.Height();
     949             :             }
     950             : 
     951       18339 :             Point aOrg(rOutDev.GetMapMode().GetOrigin());
     952       18339 :             aOrg.X()=-aOrg.X(); aOrg.Y()=-aOrg.Y();
     953       18339 :             Rectangle aOutRect(aOrg, rOutDev.GetOutputSize());
     954             : 
     955             :             // In case of tiled rendering we want to get all invalidations, so visual area is not interesting.
     956       18339 :             if (aRect.IsOver(aOutRect) || GetModel()->isTiledRendering())
     957             :             {
     958        5506 :                 InvalidateOneWin(static_cast<vcl::Window&>(rOutDev), aRect);
     959             :             }
     960             :         }
     961             :     }
     962       21161 : }
     963             : 
     964       16069 : void SdrPaintView::InvalidateOneWin(vcl::Window& rWin)
     965             : {
     966             :     // do not erase background, that causes flicker (!)
     967       16069 :     rWin.Invalidate(InvalidateFlags::NoErase);
     968       16069 : }
     969             : 
     970        5515 : void SdrPaintView::InvalidateOneWin(vcl::Window& rWin, const Rectangle& rRect)
     971             : {
     972             :     // do not erase background, that causes flicker (!)
     973        5515 :     rWin.Invalidate(rRect, InvalidateFlags::NoErase);
     974        5515 : }
     975             : 
     976           0 : void SdrPaintView::LeaveOneGroup()
     977             : {
     978           0 :     if(mpPageView)
     979             :     {
     980           0 :         mpPageView->LeaveOneGroup();
     981             :     }
     982           0 : }
     983             : 
     984           0 : void SdrPaintView::LeaveAllGroup()
     985             : {
     986           0 :     if(mpPageView)
     987             :     {
     988           0 :         mpPageView->LeaveAllGroup();
     989             :     }
     990           0 : }
     991             : 
     992        4178 : bool SdrPaintView::IsGroupEntered() const
     993             : {
     994        4178 :     if(mpPageView)
     995             :     {
     996        4178 :         return (mpPageView->GetEnteredLevel() != 0);
     997             :     }
     998             : 
     999           0 :     return false;
    1000             : }
    1001             : 
    1002           0 : void SdrPaintView::SetNotPersistDefaultAttr(const SfxItemSet& rAttr, bool /*bReplaceAll*/)
    1003             : {
    1004             :     // bReplaceAll has no effect here at all.
    1005           0 :     bool bMeasure=ISA(SdrView) && static_cast<SdrView*>(this)->IsMeasureTool();
    1006           0 :     const SfxPoolItem *pPoolItem=NULL;
    1007           0 :     if (rAttr.GetItemState(SDRATTR_LAYERID,true,&pPoolItem)==SfxItemState::SET) {
    1008           0 :         SdrLayerID nLayerId=static_cast<const SdrLayerIdItem*>(pPoolItem)->GetValue();
    1009           0 :         const SdrLayer* pLayer=pMod->GetLayerAdmin().GetLayerPerID(nLayerId);
    1010           0 :         if (pLayer!=NULL) {
    1011           0 :             if (bMeasure) aMeasureLayer=pLayer->GetName();
    1012           0 :             else aAktLayer=pLayer->GetName();
    1013             :         }
    1014             :     }
    1015           0 :     if (rAttr.GetItemState(SDRATTR_LAYERNAME,true,&pPoolItem)==SfxItemState::SET) {
    1016           0 :         if (bMeasure) aMeasureLayer=static_cast<const SdrLayerNameItem*>(pPoolItem)->GetValue();
    1017           0 :         else aAktLayer=static_cast<const SdrLayerNameItem*>(pPoolItem)->GetValue();
    1018             :     }
    1019           0 : }
    1020             : 
    1021         556 : void SdrPaintView::MergeNotPersistDefaultAttr(SfxItemSet& rAttr, bool /*bOnlyHardAttr*/) const
    1022             : {
    1023             :     // bOnlyHardAttr has no effect here at all.
    1024         556 :     bool bMeasure=ISA(SdrView) && static_cast<const SdrView*>(this)->IsMeasureTool();
    1025         556 :     const OUString& aNam = bMeasure ? aMeasureLayer : aAktLayer;
    1026         556 :     rAttr.Put(SdrLayerNameItem(aNam));
    1027         556 :     SdrLayerID nLayer=pMod->GetLayerAdmin().GetLayerID(aNam,true);
    1028         556 :     if (nLayer!=SDRLAYER_NOTFOUND) {
    1029         556 :         rAttr.Put(SdrLayerIdItem(nLayer));
    1030             :     }
    1031         556 : }
    1032             : 
    1033           0 : void SdrPaintView::SetDefaultAttr(const SfxItemSet& rAttr, bool bReplaceAll)
    1034             : {
    1035             : #ifdef DBG_UTIL
    1036             :     {
    1037             :         bool bHasEEFeatureItems=false;
    1038             :         SfxItemIter aIter(rAttr);
    1039             :         const SfxPoolItem* pItem=aIter.FirstItem();
    1040             :         while (!bHasEEFeatureItems && pItem!=NULL) {
    1041             :             if (!IsInvalidItem(pItem)) {
    1042             :                 sal_uInt16 nW=pItem->Which();
    1043             :                 if (nW>=EE_FEATURE_START && nW<=EE_FEATURE_END) bHasEEFeatureItems=true;
    1044             :             }
    1045             :             pItem=aIter.NextItem();
    1046             :         }
    1047             : 
    1048             :         if(bHasEEFeatureItems)
    1049             :         {
    1050             :             OUString aMessage("SdrPaintView::SetDefaultAttr(): Setting EE_FEATURE items at the SdrView does not make sense! It only leads to overhead and unreadable documents.");
    1051             :             ScopedVclPtr<InfoBox>::Create(nullptr, aMessage)->Execute();
    1052             :         }
    1053             :     }
    1054             : #endif
    1055           0 :     if (bReplaceAll) aDefaultAttr.Set(rAttr);
    1056           0 :     else aDefaultAttr.Put(rAttr,false); // if FALSE, regard InvalidItems as "holes," not as Default
    1057           0 :     SetNotPersistDefaultAttr(rAttr,bReplaceAll);
    1058             : #ifdef DBG_UTIL
    1059             :     if (pItemBrowser!=nullptr) pItemBrowser->SetDirty();
    1060             : #endif
    1061           0 : }
    1062             : 
    1063        9504 : void SdrPaintView::SetDefaultStyleSheet(SfxStyleSheet* pStyleSheet, bool bDontRemoveHardAttr)
    1064             : {
    1065        9504 :     if (pDefaultStyleSheet)
    1066           0 :         EndListening(*pDefaultStyleSheet);
    1067        9504 :     pDefaultStyleSheet=pStyleSheet;
    1068        9504 :     if (pDefaultStyleSheet)
    1069        1847 :         StartListening(*pDefaultStyleSheet);
    1070             : 
    1071        9504 :     if (pStyleSheet!=NULL && !bDontRemoveHardAttr) {
    1072           0 :         SfxWhichIter aIter(pStyleSheet->GetItemSet());
    1073           0 :         sal_uInt16 nWhich=aIter.FirstWhich();
    1074           0 :         while (nWhich!=0) {
    1075           0 :             if (pStyleSheet->GetItemSet().GetItemState(nWhich,true)==SfxItemState::SET) {
    1076           0 :                 aDefaultAttr.ClearItem(nWhich);
    1077             :             }
    1078           0 :             nWhich=aIter.NextWhich();
    1079           0 :         }
    1080             :     }
    1081             : #ifdef DBG_UTIL
    1082             :     if (pItemBrowser!=nullptr) pItemBrowser->SetDirty();
    1083             : #endif
    1084        9504 : }
    1085             : 
    1086         556 : bool SdrPaintView::GetAttributes(SfxItemSet& rTargetSet, bool bOnlyHardAttr) const
    1087             : {
    1088         556 :     if(bOnlyHardAttr || !pDefaultStyleSheet)
    1089             :     {
    1090           0 :         rTargetSet.Put(aDefaultAttr, false);
    1091             :     }
    1092             :     else
    1093             :     {
    1094             :         // else merge with DefStyleSheet
    1095         556 :         rTargetSet.Put(pDefaultStyleSheet->GetItemSet(), false);
    1096         556 :         rTargetSet.Put(aDefaultAttr, false);
    1097             :     }
    1098         556 :     MergeNotPersistDefaultAttr(rTargetSet, bOnlyHardAttr);
    1099         556 :     return true;
    1100             : }
    1101             : 
    1102           0 : bool SdrPaintView::SetAttributes(const SfxItemSet& rSet, bool bReplaceAll)
    1103             : {
    1104           0 :     SetDefaultAttr(rSet,bReplaceAll);
    1105           0 :     return true;
    1106             : }
    1107             : 
    1108           0 : SfxStyleSheet* SdrPaintView::GetStyleSheet() const
    1109             : {
    1110           0 :     return GetDefaultStyleSheet();
    1111             : }
    1112             : 
    1113           0 : bool SdrPaintView::SetStyleSheet(SfxStyleSheet* pStyleSheet, bool bDontRemoveHardAttr)
    1114             : {
    1115           0 :     SetDefaultStyleSheet(pStyleSheet,bDontRemoveHardAttr);
    1116           0 :     return true;
    1117             : }
    1118             : 
    1119             : 
    1120             : 
    1121             : #ifdef DBG_UTIL
    1122             : void SdrPaintView::ShowItemBrowser(bool bShow)
    1123             : {
    1124             :     if (bShow) {
    1125             :         if (pItemBrowser==nullptr) {
    1126             :             pItemBrowser=VclPtr<SdrItemBrowser>::Create(*static_cast<SdrView*>(this));
    1127             :         }
    1128             :         pItemBrowser->Show();
    1129             :         pItemBrowser->GrabFocus();
    1130             :     } else {
    1131             :         if (pItemBrowser!=nullptr) {
    1132             :             pItemBrowser->Hide();
    1133             :             pItemBrowser.disposeAndClear();
    1134             :         }
    1135             :     }
    1136             : }
    1137             : #endif
    1138             : 
    1139           0 : void SdrPaintView::MakeVisible(const Rectangle& rRect, vcl::Window& rWin)
    1140             : {
    1141           0 :     MapMode aMap(rWin.GetMapMode());
    1142           0 :     Size aActualSize(rWin.GetOutputSize());
    1143             : 
    1144           0 :     if( aActualSize.Height() > 0 && aActualSize.Width() > 0 )
    1145             :     {
    1146           0 :         Size aNewSize(rRect.GetSize());
    1147           0 :         bool bNewScale=false;
    1148           0 :         bool bNeedMoreX=aNewSize.Width()>aActualSize.Width();
    1149           0 :         bool bNeedMoreY=aNewSize.Height()>aActualSize.Height();
    1150           0 :         if (bNeedMoreX || bNeedMoreY)
    1151             :         {
    1152           0 :             bNewScale=true;
    1153             :             // set new MapMode (Size+Org) and invalidate everything
    1154           0 :             Fraction aXFact(aNewSize.Width(),aActualSize.Width());
    1155           0 :             Fraction aYFact(aNewSize.Height(),aActualSize.Height());
    1156           0 :             if (aYFact>aXFact) aXFact=aYFact;
    1157           0 :             aXFact*=aMap.GetScaleX();
    1158           0 :             aXFact.ReduceInaccurate(10); // to avoid runovers and BigInt mapping
    1159           0 :             aMap.SetScaleX(aXFact);
    1160           0 :             aMap.SetScaleY(aYFact);
    1161           0 :             rWin.SetMapMode(aMap);
    1162           0 :             aActualSize=rWin.GetOutputSize();
    1163             :         }
    1164           0 :         Point aOrg(aMap.GetOrigin());
    1165           0 :         long dx=0,dy=0;
    1166           0 :         long l=-aOrg.X();
    1167           0 :         long r=-aOrg.X()+aActualSize.Width()-1;
    1168           0 :         long o=-aOrg.Y();
    1169           0 :         long u=-aOrg.Y()+aActualSize.Height()-1;
    1170           0 :         if (l>rRect.Left()) dx=rRect.Left()-l;
    1171           0 :         else if (r<rRect.Right()) dx=rRect.Right()-r;
    1172           0 :         if (o>rRect.Top()) dy=rRect.Top()-o;
    1173           0 :         else if (u<rRect.Bottom()) dy=rRect.Bottom()-u;
    1174           0 :         aMap.SetOrigin(Point(aOrg.X()-dx,aOrg.Y()-dy));
    1175           0 :         if (!bNewScale) {
    1176           0 :             if (dx!=0 || dy!=0) {
    1177           0 :                 rWin.Scroll(-dx,-dy);
    1178           0 :                 rWin.SetMapMode(aMap);
    1179           0 :                 rWin.Update();
    1180             :             }
    1181             :         } else {
    1182           0 :             rWin.SetMapMode(aMap);
    1183           0 :             InvalidateOneWin(rWin);
    1184             :         }
    1185           0 :     }
    1186           0 : }
    1187             : 
    1188           0 : void SdrPaintView::DoConnect(SdrOle2Obj* /*pOleObj*/)
    1189             : {
    1190           0 : }
    1191             : 
    1192       53441 : void SdrPaintView::SetAnimationEnabled( bool bEnable )
    1193             : {
    1194       53441 :     SetAnimationMode( bEnable ? SDR_ANIMATION_ANIMATE : SDR_ANIMATION_DISABLE );
    1195       53441 : }
    1196             : 
    1197             : #if defined DBG_UTIL
    1198             : vcl::Window* SdrPaintView::GetItemBrowser() const
    1199             : {
    1200             :     return pItemBrowser;
    1201             : }
    1202             : #endif
    1203             : 
    1204           0 : void SdrPaintView::SetAnimationPause( bool bSet )
    1205             : {
    1206           0 :     if((bool)bAnimationPause != bSet)
    1207             :     {
    1208           0 :         bAnimationPause = bSet;
    1209             : 
    1210           0 :         if(mpPageView)
    1211             :         {
    1212           0 :             for(sal_uInt32 b(0L); b < mpPageView->PageWindowCount(); b++)
    1213             :             {
    1214           0 :                 SdrPageWindow& rPageWindow = *(mpPageView->GetPageWindow(b));
    1215           0 :                 sdr::contact::ObjectContact& rObjectContact = rPageWindow.GetObjectContact();
    1216           0 :                 sdr::animation::primitiveAnimator& rAnimator = rObjectContact.getPrimitiveAnimator();
    1217             : 
    1218           0 :                 if(rAnimator.IsPaused() != bSet)
    1219             :                 {
    1220           0 :                     rAnimator.SetPaused(bSet);
    1221             :                 }
    1222             :             }
    1223             :         }
    1224             :     }
    1225           0 : }
    1226             : 
    1227       53441 : void SdrPaintView::SetAnimationMode( const SdrAnimationMode eMode )
    1228             : {
    1229       53441 :     eAnimationMode = eMode;
    1230       53441 : }
    1231             : 
    1232       15824 : void SdrPaintView::VisAreaChanged(const OutputDevice* pOut)
    1233             : {
    1234       15824 :     if(mpPageView)
    1235             :     {
    1236       15606 :         if (pOut)
    1237             :         {
    1238       13803 :             SdrPageWindow* pWindow = mpPageView->FindPageWindow(*const_cast<OutputDevice*>(pOut));
    1239             : 
    1240       13803 :             if(pWindow)
    1241             :             {
    1242       13803 :                 VisAreaChanged(*pWindow);
    1243             :             }
    1244             :         }
    1245             :         else
    1246             :         {
    1247        3715 :             for(sal_uInt32 a(0L); a < mpPageView->PageWindowCount(); a++)
    1248             :             {
    1249        1912 :                 VisAreaChanged(*mpPageView->GetPageWindow(a));
    1250             :             }
    1251             :         }
    1252             :     }
    1253       15824 : }
    1254             : 
    1255       15715 : void SdrPaintView::VisAreaChanged(const SdrPageWindow& /*rWindow*/)
    1256             : {
    1257             :     // notify SfxListener
    1258       15715 :     Broadcast(SvxViewHint(SvxViewHint::SVX_HINT_VIEWCHANGED));
    1259       15715 : }
    1260             : 
    1261             : 
    1262        9669 : void SdrPaintView::onChangeColorConfig()
    1263             : {
    1264        9669 :     SetGridColor( Color( maColorConfig.GetColorValue( svtools::DRAWGRID ).nColor ) );
    1265        9669 : }
    1266             : 
    1267        9669 : void SdrPaintView::SetGridColor( Color aColor )
    1268             : {
    1269        9669 :     maGridColor = aColor;
    1270        9669 : }
    1271             : 
    1272             : 
    1273             : // Set background color for svx at SdrPageViews
    1274        1689 : void SdrPaintView::SetApplicationBackgroundColor(Color aBackgroundColor)
    1275             : {
    1276        1689 :     if(mpPageView)
    1277             :     {
    1278        1687 :         mpPageView->SetApplicationBackgroundColor(aBackgroundColor);
    1279             :     }
    1280        1689 : }
    1281             : 
    1282             : // Set document color for svx at SdrPageViews
    1283           0 : void SdrPaintView::SetApplicationDocumentColor(Color aDocumentColor)
    1284             : {
    1285           0 :     if(mpPageView)
    1286             :     {
    1287           0 :         mpPageView->SetApplicationDocumentColor(aDocumentColor);
    1288             :     }
    1289           0 : }
    1290             : 
    1291       14343 : bool SdrPaintView::IsBufferedOutputAllowed() const
    1292             : {
    1293       14343 :     return (mbBufferedOutputAllowed && maDrawinglayerOpt.IsPaintBuffer());
    1294             : }
    1295             : 
    1296        3798 : void SdrPaintView::SetBufferedOutputAllowed(bool bNew)
    1297             : {
    1298        3798 :     if(bNew != (bool)mbBufferedOutputAllowed)
    1299             :     {
    1300        3798 :         mbBufferedOutputAllowed = bNew;
    1301             :     }
    1302        3798 : }
    1303             : 
    1304        4421 : bool SdrPaintView::IsBufferedOverlayAllowed() const
    1305             : {
    1306        4421 :     return (mbBufferedOverlayAllowed && maDrawinglayerOpt.IsOverlayBuffer());
    1307             : }
    1308             : 
    1309        3799 : void SdrPaintView::SetBufferedOverlayAllowed(bool bNew)
    1310             : {
    1311        3799 :     if(bNew != (bool)mbBufferedOverlayAllowed)
    1312             :     {
    1313        3799 :         mbBufferedOverlayAllowed = bNew;
    1314             :     }
    1315        3799 : }
    1316             : 
    1317             : 
    1318          17 : void SdrPaintView::SetPagePaintingAllowed(bool bNew)
    1319             : {
    1320          17 :     if(bNew != (bool)mbPagePaintingAllowed)
    1321             :     {
    1322           0 :         mbPagePaintingAllowed = bNew;
    1323             :     }
    1324          17 : }
    1325             : 
    1326             : // #i38135# Sets the timer for Object animations and restarts.
    1327           0 : void SdrPaintView::SetAnimationTimer(sal_uInt32 nTime)
    1328             : {
    1329           0 :     if(mpPageView)
    1330             :     {
    1331             :         // first, reset all timers at all windows to 0L
    1332           0 :         for(sal_uInt32 a(0L); a < mpPageView->PageWindowCount(); a++)
    1333             :         {
    1334           0 :             SdrPageWindow& rPageWindow = *mpPageView->GetPageWindow(a);
    1335           0 :             sdr::contact::ObjectContact& rObjectContact = rPageWindow.GetObjectContact();
    1336           0 :             sdr::animation::primitiveAnimator& rAnimator = rObjectContact.getPrimitiveAnimator();
    1337           0 :             rAnimator.SetTime(nTime);
    1338             :         }
    1339             :     }
    1340         435 : }
    1341             : 
    1342             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.11