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