xref: /AOO41X/main/svx/source/svdraw/svdpagv.cxx (revision a56bd57b6589a8d3cc2cdff6932c7993d643327b)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_svx.hxx"
26 #include <svx/svdpagv.hxx>
27 #include <com/sun/star/awt/XWindow.hpp>
28 #include <com/sun/star/awt/PosSize.hpp>
29 #include <comphelper/processfactory.hxx>
30 #include <svx/svdoutl.hxx>
31 #include <svx/xpoly.hxx>
32 #include <svx/svdouno.hxx>
33 #include <svx/svdpage.hxx>
34 #include <svx/svdview.hxx>
35 
36 #include <svx/svdedxv.hxx>
37 #include <svx/svdpagv.hxx>
38 #include <svx/svdoutl.hxx>
39 #include <svx/svdpagv.hxx>
40 #include <editeng/outliner.hxx>
41 #include <svx/svdetc.hxx>
42 #include <svx/svdobj.hxx>
43 #include <svx/svdouno.hxx>
44 #include <svx/svdpage.hxx>
45 #include <svx/svdview.hxx>
46 #include "svx/svditer.hxx"
47 #include <svx/svdogrp.hxx>
48 #include <svx/svdtypes.hxx>
49 #include <svx/svdoole2.hxx>
50 
51 // #110094#
52 #include <svx/sdr/contact/objectcontactofpageview.hxx>
53 #include <svx/svdogrp.hxx>
54 #include <svx/sdr/contact/viewobjectcontactredirector.hxx>
55 #include <svx/fmview.hxx>
56 
57 // for search on vector
58 #include <algorithm>
59 
60 using namespace ::rtl;
61 using namespace ::com::sun::star;
62 #include <svx/sdrpagewindow.hxx>
63 #include <svx/sdrpaintwindow.hxx>
64 
65 TYPEINIT1(SdrPageView, SfxListener);
66 DBG_NAME(SdrPageView);
67 
68 ////////////////////////////////////////////////////////////////////////////////////////////////////
69 // interface to SdrPageWindow
70 
FindPageWindow(SdrPaintWindow & rPaintWindow) const71 SdrPageWindow* SdrPageView::FindPageWindow(SdrPaintWindow& rPaintWindow) const
72 {
73     for(SdrPageWindowVector::const_iterator a = maPageWindows.begin(); a != maPageWindows.end(); a++)
74     {
75         if(&((*a)->GetPaintWindow()) == &rPaintWindow)
76         {
77             return *a;
78         }
79     }
80 
81     return 0L;
82 }
83 
FindPatchedPageWindow(const OutputDevice & _rOutDev) const84 const SdrPageWindow* SdrPageView::FindPatchedPageWindow( const OutputDevice& _rOutDev ) const
85 {
86     for (   SdrPageWindowVector::const_iterator loop = maPageWindows.begin();
87             loop != maPageWindows.end();
88             ++loop
89         )
90     {
91         const SdrPageWindow& rPageWindow( *(*loop) );
92         const SdrPaintWindow& rPaintWindow( rPageWindow.GetOriginalPaintWindow() ? *rPageWindow.GetOriginalPaintWindow() : rPageWindow.GetPaintWindow() );
93         if ( &rPaintWindow.GetOutputDevice() == &_rOutDev )
94         {
95             return &rPageWindow;
96         }
97     }
98 
99     return NULL;
100 }
101 
FindPageWindow(const OutputDevice & rOutDev) const102 SdrPageWindow* SdrPageView::FindPageWindow(const OutputDevice& rOutDev) const
103 {
104     for(SdrPageWindowVector::const_iterator a = maPageWindows.begin(); a != maPageWindows.end(); a++)
105     {
106         if(&((*a)->GetPaintWindow().GetOutputDevice()) == &rOutDev)
107         {
108             return *a;
109         }
110     }
111 
112     return 0L;
113 }
114 
GetPageWindow(sal_uInt32 nIndex) const115 SdrPageWindow* SdrPageView::GetPageWindow(sal_uInt32 nIndex) const
116 {
117     // #126416#
118     if(nIndex < maPageWindows.size())
119     {
120         return maPageWindows[nIndex];
121     }
122 
123     return 0L;
124 }
125 
ClearPageWindows()126 void SdrPageView::ClearPageWindows()
127 {
128     // #126416#
129     for(SdrPageWindowVector::const_iterator a = maPageWindows.begin(); a != maPageWindows.end(); a++)
130     {
131         delete *a;
132     }
133 
134     maPageWindows.clear();
135 }
136 
AppendPageWindow(SdrPageWindow & rNew)137 void SdrPageView::AppendPageWindow(SdrPageWindow& rNew)
138 {
139     maPageWindows.push_back(&rNew);
140 }
141 
RemovePageWindow(sal_uInt32 nPos)142 SdrPageWindow* SdrPageView::RemovePageWindow(sal_uInt32 nPos)
143 {
144     if(nPos < maPageWindows.size())
145     {
146         SdrPageWindowVector::iterator aAccess = maPageWindows.begin() + nPos;
147         // #114376# remember return value
148         SdrPageWindow* pErasedSdrPageWindow = *aAccess;
149         maPageWindows.erase(aAccess);
150         return pErasedSdrPageWindow;
151     }
152 
153     return 0L;
154 }
155 
RemovePageWindow(SdrPageWindow & rOld)156 SdrPageWindow* SdrPageView::RemovePageWindow(SdrPageWindow& rOld)
157 {
158     const SdrPageWindowVector::iterator aFindResult = ::std::find(maPageWindows.begin(), maPageWindows.end(), &rOld);
159 
160     if(aFindResult != maPageWindows.end())
161     {
162         // #114376# remember return value
163         SdrPageWindow* pSdrPageWindow = *aFindResult;
164         maPageWindows.erase(aFindResult);
165         return pSdrPageWindow;
166     }
167 
168     return 0L;
169 }
170 
171 //////////////////////////////////////////////////////////////////////////////
172 
SdrPageView(SdrPage * pPage1,SdrView & rNewView)173 SdrPageView::SdrPageView(SdrPage* pPage1, SdrView& rNewView)
174 :   mrView(rNewView),
175     // #103911# col_auto color lets the view takes the default SvxColorConfig entry
176     maDocumentColor( COL_AUTO ),
177     maBackgroundColor(COL_AUTO ), // #i48367# also react on autocolor
178     mpPreparedPageWindow(0) // #i72752#
179 {
180     DBG_CTOR(SdrPageView,NULL);
181     mpPage = pPage1;
182 
183     if(mpPage)
184     {
185         aPgOrg.X()=mpPage->GetLftBorder();
186         aPgOrg.Y()=mpPage->GetUppBorder();
187     }
188     mbHasMarked = sal_False;
189     aLayerVisi.SetAll();
190     aLayerPrn.SetAll();
191 
192     mbVisible = sal_False;
193     pAktList = NULL;
194     pAktGroup = NULL;
195     SetAktGroupAndList(NULL, mpPage);
196 
197     StartListening(*rNewView.GetModel());
198 
199     for(sal_uInt32 a(0L); a < rNewView.PaintWindowCount(); a++)
200     {
201         AddPaintWindowToPageView(*rNewView.GetPaintWindow(a));
202     }
203 }
204 
~SdrPageView()205 SdrPageView::~SdrPageView()
206 {
207     DBG_DTOR(SdrPageView,NULL);
208 
209     // cleanup window vector
210     ClearPageWindows();
211 }
212 
CreateNewPageWindowEntry(SdrPaintWindow & rPaintWindow)213 SdrPageWindow& SdrPageView::CreateNewPageWindowEntry(SdrPaintWindow& rPaintWindow)
214 {
215     // MIB 3.7.08: Das WinRec muss sofort in die Liste eingetragen werden,
216     // weil sich das InsertControlContainer darauf verlaesst
217     //SdrPageViewWinRec* pRec = new SdrPageViewWinRec( *this, pOut );
218     //pWinList->Insert(pRec);
219     SdrPageWindow& rWindow = *(new SdrPageWindow(*this, rPaintWindow));
220     AppendPageWindow(rWindow);
221 
222     return rWindow;
223 }
224 
AddPaintWindowToPageView(SdrPaintWindow & rPaintWindow)225 void SdrPageView::AddPaintWindowToPageView(SdrPaintWindow& rPaintWindow)
226 {
227     if(!FindPageWindow(rPaintWindow))
228     {
229         CreateNewPageWindowEntry(rPaintWindow);
230     }
231 }
232 
RemovePaintWindowFromPageView(SdrPaintWindow & rPaintWindow)233 void SdrPageView::RemovePaintWindowFromPageView(SdrPaintWindow& rPaintWindow)
234 {
235     SdrPageWindow* pCandidate = FindPageWindow(rPaintWindow);
236 
237     if(pCandidate)
238     {
239         pCandidate = RemovePageWindow(*pCandidate);
240 
241         if(pCandidate)
242         {
243             delete pCandidate;
244         }
245     }
246 }
247 
GetControlContainer(const OutputDevice & _rDevice) const248 ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControlContainer > SdrPageView::GetControlContainer( const OutputDevice& _rDevice ) const
249 {
250     ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControlContainer > xReturn;
251     const SdrPageWindow* pCandidate = FindPatchedPageWindow( _rDevice );
252 
253     if ( pCandidate )
254         xReturn = pCandidate->GetControlContainer( true );
255 
256     return xReturn;
257 }
258 
Notify(SfxBroadcaster &,const SfxHint &)259 void __EXPORT SdrPageView::Notify(SfxBroadcaster& /*rBC*/, const SfxHint& /*rHint*/)
260 {
261     // not really interested in
262 }
263 
ModelHasChanged()264 void SdrPageView::ModelHasChanged()
265 {
266     if (GetAktGroup()!=NULL) CheckAktGroup();
267 }
268 
IsReadOnly() const269 sal_Bool SdrPageView::IsReadOnly() const
270 {
271     return (0L == GetPage() || GetView().GetModel()->IsReadOnly() || GetPage()->IsReadOnly() || GetObjList()->IsReadOnly());
272 }
273 
Show()274 void SdrPageView::Show()
275 {
276     if(!IsVisible())
277     {
278         mbVisible = sal_True;
279         InvalidateAllWin();
280 
281         for(sal_uInt32 a(0L); a < GetView().PaintWindowCount(); a++)
282         {
283             AddPaintWindowToPageView(*GetView().GetPaintWindow(a));
284         }
285     }
286 }
287 
Hide()288 void SdrPageView::Hide()
289 {
290     if(IsVisible())
291     {
292         InvalidateAllWin();
293         mbVisible = sal_False;
294         ClearPageWindows();
295     }
296 }
297 
GetPageRect() const298 Rectangle SdrPageView::GetPageRect() const
299 {
300     if (GetPage()==NULL) return Rectangle();
301     return Rectangle(Point(),Size(GetPage()->GetWdt()+1,GetPage()->GetHgt()+1));
302 }
303 
InvalidateAllWin()304 void SdrPageView::InvalidateAllWin()
305 {
306     if(IsVisible() && GetPage())
307     {
308         Rectangle aRect(Point(0,0),Size(GetPage()->GetWdt()+1,GetPage()->GetHgt()+1));
309         aRect.Union(GetPage()->GetAllObjBoundRect());
310         GetView().InvalidateAllWin(aRect);
311     }
312 }
313 
InvalidateAllWin(const Rectangle & rRect,sal_Bool bPlus1Pix)314 void SdrPageView::InvalidateAllWin(const Rectangle& rRect, sal_Bool bPlus1Pix)
315 {
316     if(IsVisible())
317     {
318         GetView().InvalidateAllWin(rRect, bPlus1Pix);
319     }
320 }
321 
322 ////////////////////////////////////////////////////////////////////////////////////////////////////
323 
PrePaint()324 void SdrPageView::PrePaint()
325 {
326     const sal_uInt32 nCount(PageWindowCount());
327 
328     for(sal_uInt32 a(0); a < nCount; a++)
329     {
330         SdrPageWindow* pCandidate = GetPageWindow(a);
331 
332         if(pCandidate)
333         {
334             pCandidate->PrePaint();
335         }
336     }
337 }
338 
PostPaint()339 void SdrPageView::PostPaint()
340 {
341     const sal_uInt32 nCount(PageWindowCount());
342 
343     for(sal_uInt32 a(0); a < nCount; a++)
344     {
345         SdrPageWindow* pCandidate = GetPageWindow(a);
346 
347         if(pCandidate)
348         {
349             pCandidate->PostPaint();
350         }
351     }
352 }
353 
CompleteRedraw(SdrPaintWindow & rPaintWindow,const Region & rReg,sdr::contact::ViewObjectContactRedirector * pRedirector) const354 void SdrPageView::CompleteRedraw(SdrPaintWindow& rPaintWindow, const Region& rReg, sdr::contact::ViewObjectContactRedirector* pRedirector) const
355 {
356     if(GetPage())
357     {
358         SdrPageWindow* pPageWindow = FindPageWindow(rPaintWindow);
359         sal_Bool bIsTempTarget(sal_False);
360 
361         if(!pPageWindow)
362         {
363             // create temp PageWindow
364             pPageWindow = new SdrPageWindow(*((SdrPageView*)this), rPaintWindow);
365             bIsTempTarget = sal_True;
366         }
367 
368         // do the redraw
369         pPageWindow->PrepareRedraw(rReg);
370         pPageWindow->RedrawAll(pRedirector);
371 
372         // get rid of temp PageWindow
373         if(bIsTempTarget)
374         {
375             delete pPageWindow;
376             pPageWindow = 0L;
377         }
378     }
379 }
380 
381 ////////////////////////////////////////////////////////////////////////////////////////////////////
382 // #i74769# use SdrPaintWindow directly
383 
setPreparedPageWindow(SdrPageWindow * pKnownTarget)384 void SdrPageView::setPreparedPageWindow(SdrPageWindow* pKnownTarget)
385 {
386     // #i72752# remember prepared SdrPageWindow
387     mpPreparedPageWindow = pKnownTarget;
388 }
389 
DrawLayer(SdrLayerID nID,OutputDevice * pGivenTarget,sdr::contact::ViewObjectContactRedirector * pRedirector) const390 void SdrPageView::DrawLayer(SdrLayerID nID, OutputDevice* pGivenTarget, sdr::contact::ViewObjectContactRedirector* pRedirector) const
391 {
392     if(GetPage())
393     {
394         if(pGivenTarget)
395         {
396             const SdrPageWindow* pKnownTarget = FindPageWindow(*pGivenTarget);
397 
398             if(pKnownTarget)
399             {
400                 // paint known target
401                 pKnownTarget->RedrawLayer(&nID, pRedirector);
402             }
403             else
404             {
405                 // #i72752# DrawLayer() uses a OutputDevice different from BeginDrawLayer. This happens
406                 // e.g. when SW paints a single text line in text edit mode. Try to use it
407                 SdrPageWindow* pPreparedTarget = mpPreparedPageWindow;
408 
409                 if(pPreparedTarget)
410                 {
411                     // if we have a prepared target, do not use a new SdrPageWindow since this
412                     // works but is expensive. Just use a temporary PaintWindow
413                     SdrPaintWindow aTemporaryPaintWindow(mrView, *pGivenTarget);
414 
415                     // Copy existing paint region to use the same as prepared in BeginDrawLayer
416                     SdrPaintWindow& rExistingPaintWindow = pPreparedTarget->GetPaintWindow();
417                     const Region& rExistingRegion = rExistingPaintWindow.GetRedrawRegion();
418                     aTemporaryPaintWindow.SetRedrawRegion(rExistingRegion);
419 
420                     // patch the ExistingPageWindow
421                     pPreparedTarget->patchPaintWindow(aTemporaryPaintWindow);
422 
423                     // redraw the layer
424                     pPreparedTarget->RedrawLayer(&nID, pRedirector);
425 
426                     // restore the ExistingPageWindow
427                     pPreparedTarget->unpatchPaintWindow();
428                 }
429                 else
430                 {
431                     OSL_ENSURE(false, "SdrPageView::DrawLayer: Creating temporary SdrPageWindow (ObjectContact), this should never be needed (!)");
432 
433                     // None of the known OutputDevices is the target of this paint, use
434                     // a temporary SdrPageWindow for this Redraw.
435                     SdrPaintWindow aTemporaryPaintWindow(mrView, *pGivenTarget);
436                     SdrPageWindow aTemporaryPageWindow(*((SdrPageView*)this), aTemporaryPaintWindow);
437 
438                     // #i72752#
439                     // Copy existing paint region if other PageWindows exist, this was created by
440                     // PrepareRedraw() from BeginDrawLayer(). Needs to be used e.g. when suddenly SW
441                     // paints into an unknown device other than the view was created for (e.g. VirtualDevice)
442                     if(PageWindowCount())
443                     {
444                         SdrPageWindow* pExistingPageWindow = GetPageWindow(0L);
445                         SdrPaintWindow& rExistingPaintWindow = pExistingPageWindow->GetPaintWindow();
446                         const Region& rExistingRegion = rExistingPaintWindow.GetRedrawRegion();
447                         aTemporaryPaintWindow.SetRedrawRegion(rExistingRegion);
448                     }
449 
450                     aTemporaryPageWindow.RedrawLayer(&nID, pRedirector);
451                 }
452             }
453         }
454         else
455         {
456             // paint in all known windows
457             for(sal_uInt32 a(0L); a < PageWindowCount(); a++)
458             {
459                 SdrPageWindow* pTarget = GetPageWindow(a);
460                 pTarget->RedrawLayer(&nID, pRedirector);
461             }
462         }
463     }
464 }
465 
SetDesignMode(bool _bDesignMode) const466 void SdrPageView::SetDesignMode( bool _bDesignMode ) const
467 {
468     for ( sal_uInt32 i = 0L; i < PageWindowCount(); ++i )
469     {
470         const SdrPageWindow& rPageViewWindow = *GetPageWindow(i);
471         rPageViewWindow.SetDesignMode( _bDesignMode );
472     }
473 }
474 
475 ////////////////////////////////////////////////////////////////////////////////////////////////////
476 
477 #ifdef OS2
478 #define RGBCOLOR(r,g,b) ((sal_uIntPtr)(((sal_uInt8)(b) | ((sal_uInt16)(g)<<8)) | (((sal_uIntPtr)(sal_uInt8)(r))<<16)))
479 #endif
480 
DrawPageViewGrid(OutputDevice & rOut,const Rectangle & rRect,Color aColor)481 void SdrPageView::DrawPageViewGrid(OutputDevice& rOut, const Rectangle& rRect, Color aColor)
482 {
483     if (GetPage()==NULL)
484         return;
485 
486     long nx1=GetView().aGridBig.Width();
487     long nx2=GetView().aGridFin.Width();
488     long ny1=GetView().aGridBig.Height();
489     long ny2=GetView().aGridFin.Height();
490 
491     if (nx1==0) nx1=nx2;
492     if (nx2==0) nx2=nx1;
493     if (ny1==0) ny1=ny2;
494     if (ny2==0) ny2=ny1;
495     if (nx1==0) { nx1=ny1; nx2=ny2; }
496     if (ny1==0) { ny1=nx1; ny2=nx2; }
497     if (nx1<0) nx1=-nx1;
498     if (nx2<0) nx2=-nx2;
499     if (ny1<0) ny1=-ny1;
500     if (ny2<0) ny2=-ny2;
501 
502     if (nx1!=0)
503     {
504         // no more global output size, use window size instead to decide grid sizes
505         long nScreenWdt = rOut.GetOutputSizePixel().Width();
506         // old: long nScreenWdt=System::GetDesktopRectPixel().GetWidth();
507 
508         // Grid bei kleinen Zoomstufen etwas erweitern
509         //Size a1PixSiz(rOut.PixelToLogic(Size(1,1)));
510         long nMinDotPix=2;
511         long nMinLinPix=4;
512 
513         if (nScreenWdt>=1600)
514         {
515             nMinDotPix=4;
516             nMinLinPix=8;
517         }
518         else if (nScreenWdt>=1024)
519         {
520             nMinDotPix=3;
521             nMinLinPix=6;
522         }
523         else
524         { // z.B. 640x480
525             nMinDotPix=2;
526             nMinLinPix=4;
527         }
528         Size aMinDotDist(rOut.PixelToLogic(Size(nMinDotPix,nMinDotPix)));
529         //Size a3PixSiz(rOut.PixelToLogic(Size(2,2)));
530         Size aMinLinDist(rOut.PixelToLogic(Size(nMinLinPix,nMinLinPix)));
531         FASTBOOL bHoriSolid=nx2<aMinDotDist.Width();
532         FASTBOOL bVertSolid=ny2<aMinDotDist.Height();
533         // Linienabstand vergroessern (mind. 4 Pixel)
534         // Vergroesserung: *2 *5 *10 *20 *50 *100 ...
535         int nTgl=0;
536         long nVal0=nx1;
537         while (nx1<aMinLinDist.Width())
538         {
539             long a=nx1;
540 
541             if (nTgl==0) nx1*=2;
542             if (nTgl==1) nx1=nVal0*5; // => nx1*=2.5
543             if (nTgl==2) nx1*=2;
544 
545             nVal0=a;
546             nTgl++; if (nTgl>=3) nTgl=0;
547         }
548         nTgl=0;
549         nVal0=ny1;
550         while (ny1<aMinLinDist.Height())
551         {
552             long a=ny1;
553 
554             if (nTgl==0) ny1*=2;
555             if (nTgl==1) ny1=nVal0*5; // => ny1*=2.5
556             if (nTgl==2) ny1*=2;
557 
558             nVal0=a;
559             nTgl++;
560 
561             if (nTgl>=3) nTgl=0;
562         }
563         // Keine Zwischenpunkte, wenn...
564         //if (nx2<a2PixSiz.Width()) nx2=nx1;
565         //if (ny2<a2PixSiz.Height()) ny2=ny1;
566 
567         FASTBOOL bHoriFine=nx2<nx1;
568         FASTBOOL bVertFine=ny2<ny1;
569         FASTBOOL bHoriLines=bHoriSolid || bHoriFine || !bVertFine;
570         FASTBOOL bVertLines=bVertSolid || bVertFine;
571 
572         Color aColorMerk( rOut.GetLineColor() );
573         rOut.SetLineColor( aColor );
574 
575         bool bMap0=rOut.IsMapModeEnabled();
576 
577         long nWrX=0;//aWriterPageOffset.X();
578         long nWrY=0;//aWriterPageOffset.Y();
579         Point aOrg(aPgOrg);
580         long x1=GetPage()->GetLftBorder()+1+nWrX;
581         long x2=GetPage()->GetWdt()-GetPage()->GetRgtBorder()-1+nWrY;
582         long y1=GetPage()->GetUppBorder()+1+nWrX;
583         long y2=GetPage()->GetHgt()-GetPage()->GetLwrBorder()-1+nWrY;
584         const SdrPageGridFrameList* pFrames=GetPage()->GetGridFrameList(this,NULL);
585         //sal_uInt16 nBufSiz=1024; // 4k Buffer = max. 512 Punkte
586         // #90353# long* pBuf = NULL;
587         sal_uInt16 nGridPaintAnz=1;
588         if (pFrames!=NULL) nGridPaintAnz=pFrames->GetCount();
589         for (sal_uInt16 nGridPaintNum=0; nGridPaintNum<nGridPaintAnz; nGridPaintNum++) {
590             if (pFrames!=NULL) {
591                 const SdrPageGridFrame& rGF=(*pFrames)[nGridPaintNum];
592                 nWrX=rGF.GetPaperRect().Left();
593                 nWrY=rGF.GetPaperRect().Top();
594                 x1=rGF.GetUserArea().Left();
595                 x2=rGF.GetUserArea().Right();
596                 y1=rGF.GetUserArea().Top();
597                 y2=rGF.GetUserArea().Bottom();
598                 aOrg=rGF.GetUserArea().TopLeft();
599                 aOrg-=rGF.GetPaperRect().TopLeft();
600             }
601             if (!rRect.IsEmpty()) {
602                 Size a1PixSiz(rOut.PixelToLogic(Size(1,1)));
603                 long nX1Pix=a1PixSiz.Width();  // 1 Pixel Toleranz drauf
604                 long nY1Pix=a1PixSiz.Height();
605                 if (x1<rRect.Left()  -nX1Pix) x1=rRect.Left()  -nX1Pix;
606                 if (x2>rRect.Right() +nX1Pix) x2=rRect.Right() +nX1Pix;
607                 if (y1<rRect.Top()   -nY1Pix) y1=rRect.Top()   -nY1Pix;
608                 if (y2>rRect.Bottom()+nY1Pix) y2=rRect.Bottom()+nY1Pix;
609             }
610             Point aPnt;
611 
612             long xBigOrg=aOrg.X()+nWrX;
613             while (xBigOrg>=x1) xBigOrg-=nx1;
614             while (xBigOrg<x1) xBigOrg+=nx1;
615             long xFinOrg=xBigOrg;
616             while (xFinOrg>=x1) xFinOrg-=nx2;
617             while (xFinOrg<x1) xFinOrg+=nx2;
618 
619             long yBigOrg=aOrg.Y()+nWrY;
620             while (yBigOrg>=y1) yBigOrg-=ny1;
621             while (yBigOrg<y1) yBigOrg+=ny1;
622             long yFinOrg=yBigOrg;
623             while (yFinOrg>=y1) yFinOrg-=ny2;
624             while (yFinOrg<y1) yFinOrg+=ny2;
625 
626             if( x1 <= x2 && y1 <= y2 )
627             {
628                 if( bHoriLines )
629                 {
630                     sal_uIntPtr nGridFlags = ( bHoriSolid ? GRID_HORZLINES : GRID_DOTS );
631                     sal_uInt16 nSteps = sal_uInt16(nx1 / nx2);
632                     sal_uInt32 nRestPerStepMul1000 = nSteps ? ( ((nx1 * 1000L)/ nSteps) - (nx2 * 1000L) ) : 0;
633                     sal_uInt32 nStepOffset = 0;
634                     sal_uInt16 nPointOffset = 0;
635 
636                     for(sal_uInt16 a=0;a<nSteps;a++)
637                     {
638                         // Zeichnen
639                         rOut.DrawGrid(
640                             Rectangle( xFinOrg + (a * nx2) + nPointOffset, yBigOrg, x2, y2 ),
641                             Size( nx1, ny1 ), nGridFlags );
642 
643                         // Schritt machen
644                         nStepOffset += nRestPerStepMul1000;
645                         while(nStepOffset >= 1000)
646                         {
647                             nStepOffset -= 1000;
648                             nPointOffset++;
649                         }
650                     }
651                 }
652 
653                 if( bVertLines )
654                 {
655                     sal_uIntPtr nGridFlags = ( bVertSolid ? GRID_VERTLINES : GRID_DOTS );
656                     sal_uInt16 nSteps = sal_uInt16(ny1 / ny2);
657                     sal_uInt32 nRestPerStepMul1000 = nSteps ? ( ((ny1 * 1000L)/ nSteps) - (ny2 * 1000L) ) : 0;
658                     sal_uInt32 nStepOffset = 0;
659                     sal_uInt16 nPointOffset = 0;
660 
661                     for(sal_uInt16 a=0;a<nSteps;a++)
662                     {
663                         // Zeichnen
664                         rOut.DrawGrid(
665                             Rectangle( xBigOrg, yFinOrg + (a * ny2) + nPointOffset, x2, y2 ),
666                             Size( nx1, ny1 ), nGridFlags );
667 
668                         // Schritt machen
669                         nStepOffset += nRestPerStepMul1000;
670                         while(nStepOffset >= 1000)
671                         {
672                             nStepOffset -= 1000;
673                             nPointOffset++;
674                         }
675                     }
676 
677                     // rOut.DrawGrid( Rectangle( xo + xBigOrg, yo + yFinOrg, x2, y2 ), Size( nx1, ny2 ), nGridFlags );
678                 }
679             }
680         }
681 
682         rOut.EnableMapMode(bMap0);
683         rOut.SetLineColor(aColorMerk);
684     }
685 }
686 
AdjHdl()687 void SdrPageView::AdjHdl()
688 {
689     GetView().AdjustMarkHdl();
690 }
691 
SetLayer(const XubString & rName,SetOfByte & rBS,sal_Bool bJa)692 void SdrPageView::SetLayer(const XubString& rName, SetOfByte& rBS, sal_Bool bJa)
693 {
694     if(!GetPage())
695         return;
696 
697     SdrLayerID nID = GetPage()->GetLayerAdmin().GetLayerID(rName, sal_True);
698 
699     if(SDRLAYER_NOTFOUND != nID)
700         rBS.Set(nID, bJa);
701 }
702 
IsLayer(const XubString & rName,const SetOfByte & rBS) const703 sal_Bool SdrPageView::IsLayer(const XubString& rName, const SetOfByte& rBS) const
704 {
705     if(!GetPage())
706         return sal_False;
707 
708     sal_Bool bRet(sal_False);
709 
710     if(rName.Len())
711     {
712         SdrLayerID nId = GetPage()->GetLayerAdmin().GetLayerID(rName, sal_True);
713 
714         if(SDRLAYER_NOTFOUND != nId)
715         {
716             bRet = rBS.IsSet(nId);
717         }
718     }
719 
720     return bRet;
721 }
722 
SetAllLayers(SetOfByte & rB,sal_Bool bJa)723 void SdrPageView::SetAllLayers(SetOfByte& rB, sal_Bool bJa)
724 {
725     if(bJa)
726     {
727         rB.SetAll();
728         rB.Clear(SDRLAYER_NOTFOUND);
729     }
730     else
731     {
732         rB.ClearAll();
733     }
734 }
735 
IsObjMarkable(SdrObject * pObj) const736 sal_Bool SdrPageView::IsObjMarkable(SdrObject* pObj) const
737 {
738     if(pObj)
739     {
740         // Vom Markieren ausgeschlossen?
741         if(pObj->IsMarkProtect())
742         {
743             return sal_False;
744         }
745 
746         // only visible are markable
747         if( !pObj->IsVisible() )
748         {
749             return sal_False;
750         }
751 
752         // #112440#
753         if(pObj->ISA(SdrObjGroup))
754         {
755             // If object is a Group object, visibility depends evtl. on
756             // multiple layers. If one object is markable, Group is markable.
757             SdrObjList* pObjList = ((SdrObjGroup*)pObj)->GetSubList();
758 
759             if(pObjList && pObjList->GetObjCount())
760             {
761                 sal_Bool bGroupIsMarkable(sal_False);
762 
763                 for(sal_uInt32 a(0L); !bGroupIsMarkable && a < pObjList->GetObjCount(); a++)
764                 {
765                     SdrObject* pCandidate = pObjList->GetObj(a);
766 
767                     // call recursively
768                     if(IsObjMarkable(pCandidate))
769                     {
770                         bGroupIsMarkable = sal_True;
771                     }
772                 }
773 
774                 return bGroupIsMarkable;
775             }
776             else
777             {
778                 // #i43302#
779                 // Allow empty groups to be selected to be able to delete them
780                 return sal_True;
781             }
782         }
783         else
784         {
785             // Der Layer muss sichtbar und darf nicht gesperrt sein
786             SdrLayerID nL = pObj->GetLayer();
787             return (aLayerVisi.IsSet(sal_uInt8(nL)) && !aLayerLock.IsSet(sal_uInt8(nL)));
788         }
789     }
790 
791     return sal_False;
792 }
793 
SetPageOrigin(const Point & rOrg)794 void SdrPageView::SetPageOrigin(const Point& rOrg)
795 {
796     if (rOrg!=aPgOrg) {
797         aPgOrg=rOrg;
798         if (GetView().IsGridVisible()) {
799             InvalidateAllWin();
800         }
801     }
802 }
803 
ImpInvalidateHelpLineArea(sal_uInt16 nNum) const804 void SdrPageView::ImpInvalidateHelpLineArea(sal_uInt16 nNum) const
805 {
806     if (GetView().IsHlplVisible() && nNum<aHelpLines.GetCount()) {
807         const SdrHelpLine& rHL=aHelpLines[nNum];
808 
809         for(sal_uInt32 a(0L); a < GetView().PaintWindowCount(); a++)
810         {
811             SdrPaintWindow* pCandidate = GetView().GetPaintWindow(a);
812 
813             if(pCandidate->OutputToWindow())
814             {
815                 OutputDevice& rOutDev = pCandidate->GetOutputDevice();
816                 Rectangle aR(rHL.GetBoundRect(rOutDev));
817                 Size aSiz(rOutDev.PixelToLogic(Size(1,1)));
818                 aR.Left() -= aSiz.Width();
819                 aR.Right() += aSiz.Width();
820                 aR.Top() -= aSiz.Height();
821                 aR.Bottom() += aSiz.Height();
822                 ((SdrView&)GetView()).InvalidateOneWin((Window&)rOutDev, aR);
823             }
824         }
825     }
826 }
827 
SetHelpLines(const SdrHelpLineList & rHLL)828 void SdrPageView::SetHelpLines(const SdrHelpLineList& rHLL)
829 {
830     aHelpLines=rHLL;
831     InvalidateAllWin();
832 }
833 
SetHelpLine(sal_uInt16 nNum,const SdrHelpLine & rNewHelpLine)834 void SdrPageView::SetHelpLine(sal_uInt16 nNum, const SdrHelpLine& rNewHelpLine)
835 {
836     if (nNum<aHelpLines.GetCount() && aHelpLines[nNum]!=rNewHelpLine) {
837         FASTBOOL bNeedRedraw=sal_True;
838         if (aHelpLines[nNum].GetKind()==rNewHelpLine.GetKind()) {
839             switch (rNewHelpLine.GetKind()) {
840                 case SDRHELPLINE_VERTICAL  : if (aHelpLines[nNum].GetPos().X()==rNewHelpLine.GetPos().X()) bNeedRedraw=sal_False; break;
841                 case SDRHELPLINE_HORIZONTAL: if (aHelpLines[nNum].GetPos().Y()==rNewHelpLine.GetPos().Y()) bNeedRedraw=sal_False; break;
842                 default: break;
843             } // switch
844         }
845         if (bNeedRedraw) ImpInvalidateHelpLineArea(nNum);
846         aHelpLines[nNum]=rNewHelpLine;
847         if (bNeedRedraw) ImpInvalidateHelpLineArea(nNum);
848     }
849 }
850 
DeleteHelpLine(sal_uInt16 nNum)851 void SdrPageView::DeleteHelpLine(sal_uInt16 nNum)
852 {
853     if (nNum<aHelpLines.GetCount()) {
854         ImpInvalidateHelpLineArea(nNum);
855         aHelpLines.Delete(nNum);
856     }
857 }
858 
InsertHelpLine(const SdrHelpLine & rHL,sal_uInt16 nNum)859 void SdrPageView::InsertHelpLine(const SdrHelpLine& rHL, sal_uInt16 nNum)
860 {
861     if (nNum>aHelpLines.GetCount()) nNum=aHelpLines.GetCount();
862     aHelpLines.Insert(rHL,nNum);
863     if (GetView().IsHlplVisible()) {
864         if (GetView().IsHlplFront()) {
865             // Hier optimieren ...
866             ImpInvalidateHelpLineArea(nNum);
867          } else {
868             ImpInvalidateHelpLineArea(nNum);
869         }
870     }
871 }
872 
873 // Betretene Gruppe und Liste setzen
SetAktGroupAndList(SdrObject * pNewGroup,SdrObjList * pNewList)874 void SdrPageView::SetAktGroupAndList(SdrObject* pNewGroup, SdrObjList* pNewList)
875 {
876     if(pAktGroup != pNewGroup)
877     {
878         pAktGroup = pNewGroup;
879     }
880     if(pAktList != pNewList)
881     {
882         pAktList = pNewList;
883     }
884 }
885 
EnterGroup(SdrObject * pObj)886 sal_Bool SdrPageView::EnterGroup(SdrObject* pObj)
887 {
888     sal_Bool bRet(sal_False);
889 
890     if(pObj && pObj->IsGroupObject())
891     {
892         sal_Bool bGlueInvalidate(GetView().ImpIsGlueVisible());
893 
894         if(bGlueInvalidate)
895         {
896             GetView().GlueInvalidate();
897         }
898 
899         // deselect all
900         GetView().UnmarkAll();
901 
902         // set current group and list
903         SdrObjList* pNewObjList = pObj->GetSubList();
904         SetAktGroupAndList(pObj, pNewObjList);
905 
906         // select contained object if only one object is contained,
907         // else select nothing and let the user decide what to do next
908         if(pNewObjList && pNewObjList->GetObjCount() == 1)
909         {
910             SdrObject* pFirstObject = pNewObjList->GetObj(0L);
911 
912             if(GetView().GetSdrPageView())
913             {
914                 GetView().MarkObj(pFirstObject, GetView().GetSdrPageView());
915             }
916         }
917 
918         // build new handles
919         GetView().AdjustMarkHdl();
920 
921         // invalidate only when view wants to visualize group entering
922         if(GetView().DoVisualizeEnteredGroup())
923         {
924             InvalidateAllWin();
925         }
926 
927         if (bGlueInvalidate)
928         {
929             GetView().GlueInvalidate();
930         }
931 
932         bRet = sal_True;
933     }
934 
935     return bRet;
936 }
937 
LeaveOneGroup()938 void SdrPageView::LeaveOneGroup()
939 {
940     if(GetAktGroup())
941     {
942         sal_Bool bGlueInvalidate = (GetView().ImpIsGlueVisible());
943 
944         if(bGlueInvalidate)
945             GetView().GlueInvalidate();
946 
947         SdrObject* pLastGroup = GetAktGroup();
948         SdrObject* pParentGroup = GetAktGroup()->GetUpGroup();
949         SdrObjList* pParentList = GetPage();
950 
951         if(pParentGroup)
952             pParentList = pParentGroup->GetSubList();
953 
954         // Alles deselektieren
955         GetView().UnmarkAll();
956 
957         // Zuweisungen, pAktGroup und pAktList muessen gesetzt sein
958         SetAktGroupAndList(pParentGroup, pParentList);
959 
960         // gerade verlassene Gruppe selektieren
961         if(pLastGroup)
962             if(GetView().GetSdrPageView())
963                 GetView().MarkObj(pLastGroup, GetView().GetSdrPageView());
964 
965         GetView().AdjustMarkHdl();
966 
967         // invalidate only when view wants to visualize group entering
968         if(GetView().DoVisualizeEnteredGroup())
969             InvalidateAllWin();
970 
971         if(bGlueInvalidate)
972             GetView().GlueInvalidate();
973     }
974 }
975 
LeaveAllGroup()976 void SdrPageView::LeaveAllGroup()
977 {
978     if(GetAktGroup())
979     {
980         sal_Bool bGlueInvalidate = (GetView().ImpIsGlueVisible());
981 
982         if(bGlueInvalidate)
983             GetView().GlueInvalidate();
984 
985         SdrObject* pLastGroup = GetAktGroup();
986 
987         // Alles deselektieren
988         GetView().UnmarkAll();
989 
990         // Zuweisungen, pAktGroup und pAktList muessen gesetzt sein
991         SetAktGroupAndList(NULL, GetPage());
992 
993         // Oberste letzte Gruppe finden und selektieren
994         if(pLastGroup)
995         {
996             while(pLastGroup->GetUpGroup())
997                 pLastGroup = pLastGroup->GetUpGroup();
998 
999             if(GetView().GetSdrPageView())
1000                 GetView().MarkObj(pLastGroup, GetView().GetSdrPageView());
1001         }
1002 
1003         GetView().AdjustMarkHdl();
1004 
1005         // invalidate only when view wants to visualize group entering
1006         if(GetView().DoVisualizeEnteredGroup())
1007             InvalidateAllWin();
1008 
1009         if(bGlueInvalidate)
1010             GetView().GlueInvalidate();
1011     }
1012 }
1013 
GetEnteredLevel() const1014 sal_uInt16 SdrPageView::GetEnteredLevel() const
1015 {
1016     sal_uInt16 nAnz=0;
1017     SdrObject* pGrp=GetAktGroup();
1018     while (pGrp!=NULL) {
1019         nAnz++;
1020         pGrp=pGrp->GetUpGroup();
1021     }
1022     return nAnz;
1023 }
1024 
GetActualGroupName() const1025 XubString SdrPageView::GetActualGroupName() const
1026 {
1027     if(GetAktGroup())
1028     {
1029         XubString aStr(GetAktGroup()->GetName());
1030 
1031         if(!aStr.Len())
1032             aStr += sal_Unicode('?');
1033 
1034         return aStr;
1035     }
1036     else
1037         return String();
1038 }
1039 
GetActualPathName(sal_Unicode cSep) const1040 XubString SdrPageView::GetActualPathName(sal_Unicode cSep) const
1041 {
1042     XubString aStr;
1043     sal_Bool bNamFnd(sal_False);
1044     SdrObject* pGrp = GetAktGroup();
1045 
1046     while(pGrp)
1047     {
1048         XubString aStr1(pGrp->GetName());
1049 
1050         if(!aStr1.Len())
1051             aStr1 += sal_Unicode('?');
1052         else
1053             bNamFnd = sal_True;
1054 
1055         aStr += aStr1;
1056         pGrp = pGrp->GetUpGroup();
1057 
1058         if(pGrp)
1059             aStr += cSep;
1060     }
1061 
1062     if(!bNamFnd && GetAktGroup())
1063     {
1064         aStr = String();
1065         aStr += sal_Unicode('(');
1066         aStr += String::CreateFromInt32( GetEnteredLevel() );
1067         aStr += sal_Unicode(')');
1068     }
1069 
1070     return aStr;
1071 }
1072 
CheckAktGroup()1073 void SdrPageView::CheckAktGroup()
1074 {
1075     SdrObject* pGrp=GetAktGroup();
1076     while (pGrp!=NULL &&
1077            (!pGrp->IsInserted() || pGrp->GetObjList()==NULL ||
1078             pGrp->GetPage()==NULL || pGrp->GetModel()==NULL)) { // irgendwas daneben?
1079         pGrp=pGrp->GetUpGroup();
1080     }
1081     if (pGrp!=GetAktGroup()) {
1082         if (pGrp!=NULL) EnterGroup(pGrp);
1083         else LeaveAllGroup();
1084     }
1085 }
1086 
1087 // #103834# Set background color for svx at SdrPageViews
SetApplicationBackgroundColor(Color aBackgroundColor)1088 void SdrPageView::SetApplicationBackgroundColor(Color aBackgroundColor)
1089 {
1090     maBackgroundColor = aBackgroundColor;
1091 }
1092 
1093 // #109585#
GetApplicationBackgroundColor() const1094 Color SdrPageView::GetApplicationBackgroundColor() const
1095 {
1096     return maBackgroundColor;
1097 }
1098 
1099 // #103911# Set document color for svx at SdrPageViews
SetApplicationDocumentColor(Color aDocumentColor)1100 void SdrPageView::SetApplicationDocumentColor(Color aDocumentColor)
1101 {
1102     maDocumentColor = aDocumentColor;
1103 }
1104 
GetApplicationDocumentColor() const1105 Color SdrPageView::GetApplicationDocumentColor() const
1106 {
1107     return maDocumentColor;
1108 }
1109 
1110 ////////////////////////////////////////////////////////////////////////////////////////////////////
1111 // eof
1112