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