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 <anchoredobjectposition.hxx>
21 : #include <environmentofanchoredobject.hxx>
22 : #include <doc.hxx>
23 : #include <flyfrm.hxx>
24 : #include <flyfrms.hxx>
25 : #include <txtfrm.hxx>
26 : #include <pagefrm.hxx>
27 : #include <frmtool.hxx>
28 : #include <svx/svdobj.hxx>
29 : #include <dflyobj.hxx>
30 : #include <dcontact.hxx>
31 : #include <frmfmt.hxx>
32 : #include <fmtornt.hxx>
33 : #include <fmtfsize.hxx>
34 : #include <fmtfollowtextflow.hxx>
35 : #include <editeng/lrspitem.hxx>
36 : #include <editeng/ulspitem.hxx>
37 : #include <ndtxt.hxx>
38 : #include <IDocumentSettingAccess.hxx>
39 : #include <textboxhelper.hxx>
40 :
41 : using namespace ::com::sun::star;
42 : using namespace objectpositioning;
43 :
44 11812 : SwAnchoredObjectPosition::SwAnchoredObjectPosition( SdrObject& _rDrawObj )
45 : : mrDrawObj( _rDrawObj ),
46 : mbIsObjFly( false ),
47 : mpAnchoredObj( 0 ),
48 : mpAnchorFrm( 0 ),
49 : mpContact( 0 ),
50 : // #i62875#
51 : mbFollowTextFlow( false ),
52 11812 : mbDoNotCaptureAnchoredObj( false )
53 : {
54 : #if OSL_DEBUG_LEVEL > 0
55 : // assert, if object isn't of excepted type
56 : const bool bObjOfExceptedType =
57 : mrDrawObj.ISA(SwVirtFlyDrawObj) || // object representing fly frame
58 : mrDrawObj.ISA(SwDrawVirtObj) || // 'virtual' drawing object
59 : ( !mrDrawObj.ISA(SdrVirtObj) && // 'master' drawing object
60 : !mrDrawObj.ISA(SwFlyDrawObj) ); // - indirectly checked
61 : (void) bObjOfExceptedType;
62 : OSL_ENSURE( bObjOfExceptedType,
63 : "SwAnchoredObjectPosition(..) - object of unexpected type!" );
64 : #endif
65 :
66 11812 : _GetInfoAboutObj();
67 11812 : }
68 :
69 : /** determine information about object
70 :
71 : members <mbIsObjFly>, <mpFrmOfObj>, <mpAnchorFrm>, <mpContact>,
72 : <mbFollowTextFlow> and <mbDoNotCaptureAnchoredObj> are set
73 : */
74 11812 : void SwAnchoredObjectPosition::_GetInfoAboutObj()
75 : {
76 : // determine, if object represents a fly frame
77 : {
78 11812 : mbIsObjFly = mrDrawObj.ISA(SwVirtFlyDrawObj);
79 : }
80 :
81 : // determine contact object
82 : {
83 11812 : mpContact = static_cast<SwContact*>(GetUserCall( &mrDrawObj ));
84 : assert(mpContact &&
85 : "SwAnchoredObjectPosition::_GetInfoAboutObj() - missing SwContact-object.");
86 : }
87 :
88 : // determine anchored object, the object belongs to
89 : {
90 : // #i26791#
91 11812 : mpAnchoredObj = mpContact->GetAnchoredObj( &mrDrawObj );
92 : assert(mpAnchoredObj &&
93 : "SwAnchoredObjectPosition::_GetInfoAboutObj() - missing anchored object.");
94 : }
95 :
96 : // determine frame, the object is anchored at
97 : {
98 : // #i26791#
99 11812 : mpAnchorFrm = mpAnchoredObj->AnchorFrm();
100 : OSL_ENSURE( mpAnchorFrm,
101 : "SwAnchoredObjectPosition::_GetInfoAboutObj() - missing anchor frame." );
102 : }
103 :
104 : // determine format the object belongs to
105 : {
106 : // #i28701#
107 11812 : mpFrameFormat = &mpAnchoredObj->GetFrameFormat();
108 : assert(mpFrameFormat &&
109 : "<SwAnchoredObjectPosition::_GetInfoAboutObj() - missing frame format.");
110 : }
111 :
112 : // #i62875# - determine attribute value of <Follow-Text-Flow>
113 : {
114 11812 : mbFollowTextFlow = mpFrameFormat->GetFollowTextFlow().GetValue();
115 : }
116 :
117 : // determine, if anchored object has not to be captured on the page.
118 : // the following conditions must be hold to *not* capture it:
119 : // - corresponding document compatibility flag is set
120 : // - it's a drawing object
121 : // - it doesn't follow the text flow
122 : {
123 16499 : mbDoNotCaptureAnchoredObj = !mbIsObjFly && !mbFollowTextFlow &&
124 16499 : mpFrameFormat->getIDocumentSettingAccess()->get(DocumentSettingId::DO_NOT_CAPTURE_DRAW_OBJS_ON_PAGE);
125 : }
126 11812 : }
127 :
128 11812 : SwAnchoredObjectPosition::~SwAnchoredObjectPosition()
129 11812 : {}
130 :
131 0 : bool SwAnchoredObjectPosition::IsAnchoredToChar() const
132 : {
133 0 : return false;
134 : }
135 :
136 0 : const SwFrm* SwAnchoredObjectPosition::ToCharOrientFrm() const
137 : {
138 0 : return NULL;
139 : }
140 :
141 0 : const SwRect* SwAnchoredObjectPosition::ToCharRect() const
142 : {
143 0 : return NULL;
144 : }
145 :
146 : // #i22341#
147 0 : SwTwips SwAnchoredObjectPosition::ToCharTopOfLine() const
148 : {
149 0 : return 0L;
150 : }
151 :
152 : /** helper method to determine top of a frame for the vertical
153 : object positioning
154 :
155 : #i11860#
156 : */
157 23044 : SwTwips SwAnchoredObjectPosition::_GetTopForObjPos( const SwFrm& _rFrm,
158 : const SwRectFn& _fnRect,
159 : const bool _bVert )
160 : {
161 23044 : SwTwips nTopOfFrmForObjPos = (_rFrm.Frm().*_fnRect->fnGetTop)();
162 :
163 23044 : if ( _rFrm.IsTextFrm() )
164 : {
165 22935 : const SwTextFrm& rTextFrm = static_cast<const SwTextFrm&>(_rFrm);
166 22935 : if ( _bVert )
167 : {
168 : nTopOfFrmForObjPos -=
169 0 : rTextFrm.GetUpperSpaceAmountConsideredForPrevFrmAndPageGrid();
170 : }
171 : else
172 : {
173 : nTopOfFrmForObjPos +=
174 22935 : rTextFrm.GetUpperSpaceAmountConsideredForPrevFrmAndPageGrid();
175 : }
176 : }
177 :
178 23044 : return nTopOfFrmForObjPos;
179 : }
180 :
181 723 : void SwAnchoredObjectPosition::_GetVertAlignmentValues(
182 : const SwFrm& _rVertOrientFrm,
183 : const SwFrm& _rPageAlignLayFrm,
184 : const sal_Int16 _eRelOrient,
185 : SwTwips& _orAlignAreaHeight,
186 : SwTwips& _orAlignAreaOffset ) const
187 : {
188 723 : SwTwips nHeight = 0;
189 723 : SwTwips nOffset = 0;
190 723 : SWRECTFN( (&_rVertOrientFrm) )
191 : // #i11860# - top of <_rVertOrientFrm> for object positioning
192 723 : const SwTwips nVertOrientTop = _GetTopForObjPos( _rVertOrientFrm, fnRect, bVert );
193 : // #i11860# - upper space amount of <_rVertOrientFrm> considered
194 : // for previous frame
195 : const SwTwips nVertOrientUpperSpaceForPrevFrmAndPageGrid =
196 723 : _rVertOrientFrm.IsTextFrm()
197 : ? static_cast<const SwTextFrm&>(_rVertOrientFrm).
198 614 : GetUpperSpaceAmountConsideredForPrevFrmAndPageGrid()
199 1337 : : 0;
200 723 : switch ( _eRelOrient )
201 : {
202 : case text::RelOrientation::FRAME:
203 : {
204 : // #i11860# - consider upper space of previous frame
205 134 : nHeight = (_rVertOrientFrm.Frm().*fnRect->fnGetHeight)() -
206 134 : nVertOrientUpperSpaceForPrevFrmAndPageGrid;
207 134 : nOffset = 0;
208 : }
209 134 : break;
210 : case text::RelOrientation::PRINT_AREA:
211 : {
212 88 : nHeight = (_rVertOrientFrm.Prt().*fnRect->fnGetHeight)();
213 : // #i11860# - consider upper space of previous frame
214 88 : nOffset = (_rVertOrientFrm.*fnRect->fnGetTopMargin)() -
215 88 : nVertOrientUpperSpaceForPrevFrmAndPageGrid;
216 : // if aligned to page in horizontal layout, consider header and
217 : // footer frame height appropriately.
218 88 : if( _rVertOrientFrm.IsPageFrm() && !bVert )
219 : {
220 : const SwFrm* pPrtFrm =
221 3 : static_cast<const SwPageFrm&>(_rVertOrientFrm).Lower();
222 11 : while( pPrtFrm )
223 : {
224 5 : if( pPrtFrm->IsHeaderFrm() )
225 : {
226 0 : nHeight -= pPrtFrm->Frm().Height();
227 0 : nOffset += pPrtFrm->Frm().Height();
228 : }
229 5 : else if( pPrtFrm->IsFooterFrm() )
230 : {
231 0 : nHeight -= pPrtFrm->Frm().Height();
232 : }
233 5 : pPrtFrm = pPrtFrm->GetNext();
234 : }
235 : }
236 : }
237 88 : break;
238 : case text::RelOrientation::PAGE_FRAME:
239 : {
240 150 : nHeight = (_rPageAlignLayFrm.Frm().*fnRect->fnGetHeight)();
241 : nOffset = (*fnRect->fnYDiff)(
242 450 : (_rPageAlignLayFrm.Frm().*fnRect->fnGetTop)(),
243 600 : nVertOrientTop );
244 : }
245 150 : break;
246 : case text::RelOrientation::PAGE_PRINT_AREA:
247 : {
248 342 : nHeight = (_rPageAlignLayFrm.Prt().*fnRect->fnGetHeight)();
249 342 : nOffset = (_rPageAlignLayFrm.*fnRect->fnGetTopMargin)() +
250 : (*fnRect->fnYDiff)(
251 1026 : (_rPageAlignLayFrm.Frm().*fnRect->fnGetTop)(),
252 1368 : nVertOrientTop );
253 : // if aligned to page in horizontal layout, consider header and
254 : // footer frame height appropriately.
255 342 : if( _rPageAlignLayFrm.IsPageFrm() && !bVert )
256 : {
257 : const SwFrm* pPrtFrm =
258 339 : static_cast<const SwPageFrm&>(_rPageAlignLayFrm).Lower();
259 1678 : while( pPrtFrm )
260 : {
261 1000 : if( pPrtFrm->IsHeaderFrm() )
262 : {
263 329 : nHeight -= pPrtFrm->Frm().Height();
264 329 : nOffset += pPrtFrm->Frm().Height();
265 : }
266 671 : else if( pPrtFrm->IsFooterFrm() )
267 : {
268 332 : nHeight -= pPrtFrm->Frm().Height();
269 : }
270 1000 : pPrtFrm = pPrtFrm->GetNext();
271 : }
272 : }
273 : }
274 342 : break;
275 : // #i22341# - vertical alignment at top of line
276 : case text::RelOrientation::TEXT_LINE:
277 : {
278 9 : if ( IsAnchoredToChar() )
279 : {
280 0 : nHeight = 0;
281 0 : nOffset = (*fnRect->fnYDiff)( ToCharTopOfLine(), nVertOrientTop );
282 : }
283 : else
284 : {
285 : OSL_FAIL( "<SwAnchoredObjectPosition::_GetVertAlignmentValues(..)> - invalid relative alignment" );
286 : }
287 : }
288 9 : break;
289 : case text::RelOrientation::CHAR:
290 : {
291 0 : if ( IsAnchoredToChar() )
292 : {
293 0 : nHeight = (ToCharRect()->*fnRect->fnGetHeight)();
294 0 : nOffset = (*fnRect->fnYDiff)( (ToCharRect()->*fnRect->fnGetTop)(),
295 0 : nVertOrientTop );
296 : }
297 : else
298 : {
299 : OSL_FAIL( "<SwAnchoredObjectPosition::_GetVertAlignmentValues(..)> - invalid relative alignment" );
300 : }
301 : }
302 0 : break;
303 : // no break here, because text::RelOrientation::CHAR is invalid, if !mbAnchorToChar
304 : default:
305 : {
306 : OSL_FAIL( "<SwAnchoredObjectPosition::_GetVertAlignmentValues(..)> - invalid relative alignment" );
307 : }
308 : }
309 :
310 723 : _orAlignAreaHeight = nHeight;
311 723 : _orAlignAreaOffset = nOffset;
312 723 : }
313 :
314 : // #i26791# - add output parameter <_roVertOffsetToFrmAnchorPos>
315 109 : SwTwips SwAnchoredObjectPosition::_GetVertRelPos(
316 : const SwFrm& _rVertOrientFrm,
317 : const SwFrm& _rPageAlignLayFrm,
318 : const sal_Int16 _eVertOrient,
319 : const sal_Int16 _eRelOrient,
320 : const SwTwips _nVertPos,
321 : const SvxLRSpaceItem& _rLRSpacing,
322 : const SvxULSpaceItem& _rULSpacing,
323 : SwTwips& _roVertOffsetToFrmAnchorPos ) const
324 : {
325 109 : SwTwips nRelPosY = 0;
326 109 : SWRECTFN( (&_rVertOrientFrm) );
327 :
328 : SwTwips nAlignAreaHeight;
329 : SwTwips nAlignAreaOffset;
330 : _GetVertAlignmentValues( _rVertOrientFrm, _rPageAlignLayFrm,
331 109 : _eRelOrient, nAlignAreaHeight, nAlignAreaOffset );
332 :
333 109 : nRelPosY = nAlignAreaOffset;
334 109 : const SwRect aObjBoundRect( GetAnchoredObj().GetObjRect() );
335 109 : const SwTwips nObjHeight = (aObjBoundRect.*fnRect->fnGetHeight)();
336 :
337 109 : switch ( _eVertOrient )
338 : {
339 : case text::VertOrientation::NONE:
340 : {
341 : // 'manual' vertical position
342 98 : nRelPosY += _nVertPos;
343 : }
344 98 : break;
345 : case text::VertOrientation::TOP:
346 : {
347 : nRelPosY += bVert
348 : ? ( bVertL2R
349 : ? _rLRSpacing.GetLeft()
350 : : _rLRSpacing.GetRight() )
351 5 : : _rULSpacing.GetUpper();
352 : }
353 5 : break;
354 : case text::VertOrientation::CENTER:
355 : {
356 0 : nRelPosY += (nAlignAreaHeight / 2) - (nObjHeight / 2);
357 : }
358 0 : break;
359 : case text::VertOrientation::BOTTOM:
360 : {
361 6 : nRelPosY += nAlignAreaHeight -
362 12 : ( nObjHeight + ( bVert
363 : ? ( bVertL2R
364 : ? _rLRSpacing.GetRight()
365 : : _rLRSpacing.GetLeft() )
366 12 : : _rULSpacing.GetLower() ) );
367 : }
368 6 : break;
369 : default:
370 : {
371 : OSL_FAIL( "<SwAnchoredObjectPosition::_GetVertRelPos(..) - invalid vertical positioning" );
372 : }
373 : }
374 :
375 : // #i26791#
376 109 : _roVertOffsetToFrmAnchorPos = nAlignAreaOffset;
377 :
378 109 : return nRelPosY;
379 : }
380 :
381 : /** adjust calculated vertical in order to keep object inside
382 : 'page' alignment layout frame.
383 :
384 : #i28701# - parameter <_nTopOfAnch> and <_bVert> added
385 : #i31805# - add parameter <_bCheckBottom>
386 : #i26945# - add parameter <_bFollowTextFlow>
387 : #i62875# - method now private and renamed.
388 : OD 2009-09-01 #mongolianlayout# - add parameter <bVertL2R>
389 : */
390 4587 : SwTwips SwAnchoredObjectPosition::_ImplAdjustVertRelPos( const SwTwips nTopOfAnch,
391 : const bool bVert,
392 : const bool bVertL2R,
393 : const SwFrm& rPageAlignLayFrm,
394 : const SwTwips nProposedRelPosY,
395 : const bool bFollowTextFlow,
396 : const bool bCheckBottom ) const
397 : {
398 4587 : SwTwips nAdjustedRelPosY = nProposedRelPosY;
399 :
400 4587 : const Size aObjSize( GetAnchoredObj().GetObjRect().SSize() );
401 :
402 : // determine the area of 'page' alignment frame, to which the vertical
403 : // position is restricted.
404 : // #i28701# - Extend restricted area for the vertical
405 : // position to area of the page frame, if wrapping style influence is
406 : // considered on object positioning. Needed to avoid layout loops in the
407 : // object positioning algorithm considering the wrapping style influence
408 : // caused by objects, which follow the text flow and thus are restricted
409 : // to its environment (e.g. page header/footer).
410 4587 : SwRect aPgAlignArea;
411 : {
412 : // #i26945# - no extension of restricted area, if
413 : // object's attribute follow text flow is set and its inside a table
414 12920 : if ( GetFrameFormat().getIDocumentSettingAccess()->get(DocumentSettingId::CONSIDER_WRAP_ON_OBJECT_POSITION) &&
415 4253 : ( !bFollowTextFlow ||
416 85 : !GetAnchoredObj().GetAnchorFrm()->IsInTab() ) )
417 : {
418 4165 : aPgAlignArea = rPageAlignLayFrm.FindPageFrm()->Frm();
419 : }
420 : else
421 : {
422 422 : aPgAlignArea = rPageAlignLayFrm.Frm();
423 : }
424 : }
425 :
426 4587 : if ( bVert )
427 : {
428 : // #i31805# - consider value of <_bCheckBottom>
429 0 : if ( !bVertL2R )
430 : {
431 0 : if ( bCheckBottom &&
432 0 : nTopOfAnch - nAdjustedRelPosY - aObjSize.Width() <
433 0 : aPgAlignArea.Left() )
434 : {
435 0 : nAdjustedRelPosY = aPgAlignArea.Left() +
436 : nTopOfAnch -
437 0 : aObjSize.Width();
438 : }
439 : // #i32964# - correction
440 0 : if ( nTopOfAnch - nAdjustedRelPosY > aPgAlignArea.Right() )
441 : {
442 0 : nAdjustedRelPosY = nTopOfAnch - aPgAlignArea.Right();
443 : }
444 : }
445 : else
446 : {
447 0 : if ( bCheckBottom &&
448 0 : nTopOfAnch + nAdjustedRelPosY + aObjSize.Width() >
449 0 : aPgAlignArea.Right() )
450 : {
451 0 : nAdjustedRelPosY = aPgAlignArea.Right() -
452 : nTopOfAnch -
453 0 : aObjSize.Width();
454 : }
455 0 : if ( nTopOfAnch + nAdjustedRelPosY < aPgAlignArea.Left() )
456 : {
457 0 : nAdjustedRelPosY = aPgAlignArea.Left() - nTopOfAnch;
458 : }
459 : }
460 : }
461 : else
462 : {
463 : // #i31805# - consider value of <bCheckBottom>
464 9094 : if ( bCheckBottom &&
465 4507 : nTopOfAnch + nAdjustedRelPosY + aObjSize.Height() >
466 4507 : aPgAlignArea.Top() + aPgAlignArea.Height() )
467 : {
468 178 : nAdjustedRelPosY = aPgAlignArea.Top() + aPgAlignArea.Height() -
469 : nTopOfAnch -
470 178 : aObjSize.Height();
471 : }
472 4587 : if ( nTopOfAnch + nAdjustedRelPosY < aPgAlignArea.Top() )
473 : {
474 488 : nAdjustedRelPosY = aPgAlignArea.Top() - nTopOfAnch;
475 : }
476 :
477 : // tdf#91260 - allow textboxes extending beyond the page bottom
478 4587 : if ( nAdjustedRelPosY < nProposedRelPosY )
479 : {
480 146 : const SwFrameFormat* pFormat = &(GetFrameFormat());
481 146 : if ( SwTextBoxHelper::isTextBox(&GetObject()) )
482 : {
483 : // shrink textboxes to extend beyond the page bottom
484 27 : SwFrameFormat* pFrameFormat = ::FindFrameFormat(&GetObject());
485 27 : SwFormatFrmSize aSize(pFormat->GetFrmSize());
486 27 : SwTwips nShrinked = aSize.GetHeight() - (nProposedRelPosY - nAdjustedRelPosY);
487 27 : aSize.SetHeight( nShrinked > 0 ? nShrinked : 0 );
488 27 : pFrameFormat->SetFormatAttr(aSize);
489 27 : nAdjustedRelPosY = nProposedRelPosY;
490 119 : } else if ( SwTextBoxHelper::findTextBox(pFormat) )
491 : // when the shape has a textbox, use only the proposed vertical position
492 24 : nAdjustedRelPosY = nProposedRelPosY;
493 : }
494 : }
495 4587 : return nAdjustedRelPosY;
496 : }
497 :
498 : /** adjust calculated horizontal in order to keep object inside
499 : 'page' alignment layout frame.
500 :
501 : #i62875# - method now private and renamed.
502 : */
503 4587 : SwTwips SwAnchoredObjectPosition::_ImplAdjustHoriRelPos(
504 : const SwFrm& _rPageAlignLayFrm,
505 : const SwTwips _nProposedRelPosX ) const
506 : {
507 4587 : SwTwips nAdjustedRelPosX = _nProposedRelPosX;
508 :
509 4587 : const SwFrm& rAnchorFrm = GetAnchorFrm();
510 4587 : const bool bVert = rAnchorFrm.IsVertical();
511 :
512 4587 : const Size aObjSize( GetAnchoredObj().GetObjRect().SSize() );
513 :
514 4587 : if( bVert )
515 : {
516 0 : if ( rAnchorFrm.Frm().Top() + nAdjustedRelPosX + aObjSize.Height() >
517 0 : _rPageAlignLayFrm.Frm().Bottom() )
518 : {
519 0 : nAdjustedRelPosX = _rPageAlignLayFrm.Frm().Bottom() -
520 0 : rAnchorFrm.Frm().Top() -
521 0 : aObjSize.Height();
522 : }
523 0 : if ( rAnchorFrm.Frm().Top() + nAdjustedRelPosX <
524 0 : _rPageAlignLayFrm.Frm().Top() )
525 : {
526 0 : nAdjustedRelPosX = _rPageAlignLayFrm.Frm().Top() -
527 0 : rAnchorFrm.Frm().Top();
528 : }
529 : }
530 : else
531 : {
532 9174 : if ( rAnchorFrm.Frm().Left() + nAdjustedRelPosX + aObjSize.Width() >
533 4587 : _rPageAlignLayFrm.Frm().Right() )
534 : {
535 296 : nAdjustedRelPosX = _rPageAlignLayFrm.Frm().Right() -
536 148 : rAnchorFrm.Frm().Left() -
537 148 : aObjSize.Width();
538 : }
539 9174 : if ( rAnchorFrm.Frm().Left() + nAdjustedRelPosX <
540 4587 : _rPageAlignLayFrm.Frm().Left() )
541 : {
542 54 : nAdjustedRelPosX = _rPageAlignLayFrm.Frm().Left() -
543 54 : rAnchorFrm.Frm().Left();
544 : }
545 : }
546 :
547 4587 : return nAdjustedRelPosX;
548 : }
549 :
550 : /** determine alignment value for horizontal position of object */
551 4696 : void SwAnchoredObjectPosition::_GetHoriAlignmentValues( const SwFrm& _rHoriOrientFrm,
552 : const SwFrm& _rPageAlignLayFrm,
553 : const sal_Int16 _eRelOrient,
554 : const bool _bObjWrapThrough,
555 : SwTwips& _orAlignAreaWidth,
556 : SwTwips& _orAlignAreaOffset,
557 : bool& _obAlignedRelToPage ) const
558 : {
559 4696 : SwTwips nWidth = 0;
560 4696 : SwTwips nOffset = 0;
561 4696 : SWRECTFN( (&_rHoriOrientFrm) )
562 4696 : switch ( _eRelOrient )
563 : {
564 : case text::RelOrientation::PRINT_AREA:
565 : {
566 87 : nWidth = (_rHoriOrientFrm.Prt().*fnRect->fnGetWidth)();
567 87 : nOffset = (_rHoriOrientFrm.*fnRect->fnGetLeftMargin)();
568 87 : if ( _rHoriOrientFrm.IsTextFrm() )
569 : {
570 : // consider movement of text frame left
571 82 : nOffset += static_cast<const SwTextFrm&>(_rHoriOrientFrm).GetBaseOfstForFly( !_bObjWrapThrough );
572 : }
573 5 : else if ( _rHoriOrientFrm.IsPageFrm() && bVert )
574 : {
575 : // for to-page anchored objects, consider header/footer frame
576 : // in vertical layout
577 : const SwFrm* pPrtFrm =
578 0 : static_cast<const SwPageFrm&>(_rHoriOrientFrm).Lower();
579 0 : while( pPrtFrm )
580 : {
581 0 : if( pPrtFrm->IsHeaderFrm() )
582 : {
583 0 : nWidth -= pPrtFrm->Frm().Height();
584 0 : nOffset += pPrtFrm->Frm().Height();
585 : }
586 0 : else if( pPrtFrm->IsFooterFrm() )
587 : {
588 0 : nWidth -= pPrtFrm->Frm().Height();
589 : }
590 0 : pPrtFrm = pPrtFrm->GetNext();
591 : }
592 : }
593 87 : break;
594 : }
595 : case text::RelOrientation::PAGE_LEFT:
596 : {
597 : // align at left border of page frame/fly frame/cell frame
598 4 : nWidth = (_rPageAlignLayFrm.*fnRect->fnGetLeftMargin)();
599 : nOffset = (*fnRect->fnXDiff)(
600 8 : (_rPageAlignLayFrm.Frm().*fnRect->fnGetLeft)(),
601 12 : (_rHoriOrientFrm.Frm().*fnRect->fnGetLeft)() );
602 4 : _obAlignedRelToPage = true;
603 : }
604 4 : break;
605 : case text::RelOrientation::PAGE_RIGHT:
606 : {
607 : // align at right border of page frame/fly frame/cell frame
608 8 : nWidth = (_rPageAlignLayFrm.*fnRect->fnGetRightMargin)();
609 : nOffset = (*fnRect->fnXDiff)(
610 16 : (_rPageAlignLayFrm.*fnRect->fnGetPrtRight)(),
611 24 : (_rHoriOrientFrm.Frm().*fnRect->fnGetLeft)() );
612 8 : _obAlignedRelToPage = true;
613 : }
614 8 : break;
615 : case text::RelOrientation::FRAME_LEFT:
616 : {
617 : // align at left border of anchor frame
618 0 : nWidth = (_rHoriOrientFrm.*fnRect->fnGetLeftMargin)();
619 0 : nOffset = 0;
620 : }
621 0 : break;
622 : case text::RelOrientation::FRAME_RIGHT:
623 : {
624 : // align at right border of anchor frame
625 : // Unify and simplify
626 0 : nWidth = (_rHoriOrientFrm.*fnRect->fnGetRightMargin)();
627 0 : nOffset = (_rHoriOrientFrm.Prt().*fnRect->fnGetRight)();
628 : }
629 0 : break;
630 : case text::RelOrientation::CHAR:
631 : {
632 : // alignment relative to character - assure, that corresponding
633 : // character rectangle is set.
634 9 : if ( IsAnchoredToChar() )
635 : {
636 9 : nWidth = 0;
637 : nOffset = (*fnRect->fnXDiff)(
638 18 : (ToCharRect()->*fnRect->fnGetLeft)(),
639 27 : (ToCharOrientFrm()->Frm().*fnRect->fnGetLeft)() );
640 9 : break;
641 : }
642 : // no break!
643 : }
644 : case text::RelOrientation::PAGE_PRINT_AREA:
645 : {
646 808 : nWidth = (_rPageAlignLayFrm.Prt().*fnRect->fnGetWidth)();
647 : nOffset = (*fnRect->fnXDiff)(
648 1616 : (_rPageAlignLayFrm.*fnRect->fnGetPrtLeft)(),
649 2424 : (_rHoriOrientFrm.Frm().*fnRect->fnGetLeft)() );
650 808 : if ( _rHoriOrientFrm.IsPageFrm() && bVert )
651 : {
652 : // for to-page anchored objects, consider header/footer frame
653 : // in vertical layout
654 : const SwFrm* pPrtFrm =
655 0 : static_cast<const SwPageFrm&>(_rHoriOrientFrm).Lower();
656 0 : while( pPrtFrm )
657 : {
658 0 : if( pPrtFrm->IsHeaderFrm() )
659 : {
660 0 : nWidth -= pPrtFrm->Frm().Height();
661 0 : nOffset += pPrtFrm->Frm().Height();
662 : }
663 0 : else if( pPrtFrm->IsFooterFrm() )
664 : {
665 0 : nWidth -= pPrtFrm->Frm().Height();
666 : }
667 0 : pPrtFrm = pPrtFrm->GetNext();
668 : }
669 : }
670 808 : _obAlignedRelToPage = true;
671 808 : break;
672 : }
673 : case text::RelOrientation::PAGE_FRAME:
674 : {
675 602 : nWidth = (_rPageAlignLayFrm.Frm().*fnRect->fnGetWidth)();
676 : nOffset = (*fnRect->fnXDiff)(
677 1204 : (_rPageAlignLayFrm.Frm().*fnRect->fnGetLeft)(),
678 1806 : (_rHoriOrientFrm.Frm().*fnRect->fnGetLeft)() );
679 602 : _obAlignedRelToPage = true;
680 602 : break;
681 : }
682 : default:
683 : {
684 3178 : nWidth = (_rHoriOrientFrm.Frm().*fnRect->fnGetWidth)();
685 :
686 : // When positioning TextBoxes, always ignore flys anchored at the
687 : // text frame, as we do want to have the textbox overlap with its
688 : // draw shape.
689 3178 : bool bIgnoreFlysAnchoredAtFrame = !_bObjWrapThrough || SwTextBoxHelper::isTextBox(&GetObject());
690 3178 : nOffset = _rHoriOrientFrm.IsTextFrm() ?
691 3127 : static_cast<const SwTextFrm&>(_rHoriOrientFrm).GetBaseOfstForFly( bIgnoreFlysAnchoredAtFrame ) :
692 6305 : 0;
693 3178 : break;
694 : }
695 : }
696 :
697 4696 : _orAlignAreaWidth = nWidth;
698 4696 : _orAlignAreaOffset = nOffset;
699 4696 : }
700 :
701 : /** toggle given horizontal orientation and relative alignment */
702 4696 : void SwAnchoredObjectPosition::_ToggleHoriOrientAndAlign(
703 : const bool _bToggleLeftRight,
704 : sal_Int16& _ioeHoriOrient,
705 : sal_Int16& _iopeRelOrient
706 : )
707 : {
708 4696 : if( _bToggleLeftRight )
709 : {
710 : // toggle orientation
711 0 : switch ( _ioeHoriOrient )
712 : {
713 : case text::HoriOrientation::RIGHT :
714 : {
715 0 : _ioeHoriOrient = text::HoriOrientation::LEFT;
716 : }
717 0 : break;
718 : case text::HoriOrientation::LEFT :
719 : {
720 0 : _ioeHoriOrient = text::HoriOrientation::RIGHT;
721 : }
722 0 : break;
723 : default:
724 0 : break;
725 : }
726 :
727 : // toggle relative alignment
728 0 : switch ( _iopeRelOrient )
729 : {
730 : case text::RelOrientation::PAGE_RIGHT :
731 : {
732 0 : _iopeRelOrient = text::RelOrientation::PAGE_LEFT;
733 : }
734 0 : break;
735 : case text::RelOrientation::PAGE_LEFT :
736 : {
737 0 : _iopeRelOrient = text::RelOrientation::PAGE_RIGHT;
738 : }
739 0 : break;
740 : case text::RelOrientation::FRAME_RIGHT :
741 : {
742 0 : _iopeRelOrient = text::RelOrientation::FRAME_LEFT;
743 : }
744 0 : break;
745 : case text::RelOrientation::FRAME_LEFT :
746 : {
747 0 : _iopeRelOrient = text::RelOrientation::FRAME_RIGHT;
748 : }
749 0 : break;
750 : default:
751 0 : break;
752 : }
753 : }
754 4696 : }
755 :
756 : /** calculate relative horizontal position */
757 4587 : SwTwips SwAnchoredObjectPosition::_CalcRelPosX(
758 : const SwFrm& _rHoriOrientFrm,
759 : const SwEnvironmentOfAnchoredObject& _rEnvOfObj,
760 : const SwFormatHoriOrient& _rHoriOrient,
761 : const SvxLRSpaceItem& _rLRSpacing,
762 : const SvxULSpaceItem& _rULSpacing,
763 : const bool _bObjWrapThrough,
764 : const SwTwips _nRelPosY,
765 : SwTwips& _roHoriOffsetToFrmAnchorPos
766 : ) const
767 : {
768 : // determine 'page' alignment layout frame
769 : const SwFrm& rPageAlignLayFrm =
770 4587 : _rEnvOfObj.GetHoriEnvironmentLayoutFrm( _rHoriOrientFrm );
771 :
772 4587 : const bool bEvenPage = !rPageAlignLayFrm.OnRightPage();
773 4587 : const bool bToggle = _rHoriOrient.IsPosToggle() && bEvenPage;
774 :
775 : // determine orientation and relative alignment
776 4587 : sal_Int16 eHoriOrient = _rHoriOrient.GetHoriOrient();
777 4587 : sal_Int16 eRelOrient = _rHoriOrient.GetRelationOrient();
778 : // toggle orientation and relative alignment
779 4587 : _ToggleHoriOrientAndAlign( bToggle, eHoriOrient, eRelOrient );
780 :
781 : // determine alignment parameter
782 : // <nWidth>: 'width' of alignment area
783 : // <nOffset>: offset of alignment area, relative to 'left' of anchor frame
784 4587 : SwTwips nWidth = 0;
785 4587 : SwTwips nOffset = 0;
786 4587 : bool bAlignedRelToPage = false;
787 : _GetHoriAlignmentValues( _rHoriOrientFrm, rPageAlignLayFrm,
788 : eRelOrient, _bObjWrapThrough,
789 4587 : nWidth, nOffset, bAlignedRelToPage );
790 :
791 4587 : const SwFrm& rAnchorFrm = GetAnchorFrm();
792 4587 : SWRECTFN( (&_rHoriOrientFrm) )
793 4587 : SwTwips nObjWidth = (GetAnchoredObj().GetObjRect().*fnRect->fnGetWidth)();
794 4587 : SwTwips nRelPosX = nOffset;
795 4587 : if ( _rHoriOrient.GetHoriOrient() == text::HoriOrientation::NONE )
796 : {
797 : // 'manual' horizonal position
798 3824 : const bool bR2L = rAnchorFrm.IsRightToLeft();
799 3824 : if( IsAnchoredToChar() && text::RelOrientation::CHAR == eRelOrient )
800 : {
801 9 : if( bR2L )
802 0 : nRelPosX -= _rHoriOrient.GetPos();
803 : else
804 9 : nRelPosX += _rHoriOrient.GetPos();
805 : }
806 3815 : else if ( bToggle || ( !_rHoriOrient.IsPosToggle() && bR2L ) )
807 : {
808 : // Correction: consider <nOffset> also for
809 : // toggling from left to right.
810 0 : nRelPosX += nWidth - nObjWidth - _rHoriOrient.GetPos();
811 : }
812 : else
813 : {
814 3815 : nRelPosX += _rHoriOrient.GetPos();
815 : }
816 : }
817 763 : else if ( text::HoriOrientation::CENTER == eHoriOrient )
818 684 : nRelPosX += (nWidth / 2) - (nObjWidth / 2);
819 79 : else if ( text::HoriOrientation::RIGHT == eHoriOrient )
820 67 : nRelPosX += nWidth -
821 67 : ( nObjWidth +
822 67 : ( bVert ? _rULSpacing.GetLower() : _rLRSpacing.GetRight() ) );
823 : else
824 12 : nRelPosX += bVert ? _rULSpacing.GetUpper() : _rLRSpacing.GetLeft();
825 :
826 : // adjust relative position by distance between anchor frame and
827 : // the frame, the object is oriented at.
828 4587 : if ( &rAnchorFrm != &_rHoriOrientFrm )
829 : {
830 2 : SwTwips nLeftOrient = (_rHoriOrientFrm.Frm().*fnRect->fnGetLeft)();
831 2 : SwTwips nLeftAnchor = (rAnchorFrm.Frm().*fnRect->fnGetLeft)();
832 2 : nRelPosX += (*fnRect->fnXDiff)( nLeftOrient, nLeftAnchor );
833 : }
834 :
835 : // adjust calculated relative horizontal position, in order to
836 : // keep object inside 'page' alignment layout frame
837 : const SwFrm& rEnvironmentLayFrm =
838 4587 : _rEnvOfObj.GetHoriEnvironmentLayoutFrm( _rHoriOrientFrm );
839 4587 : nRelPosX = _AdjustHoriRelPos( rEnvironmentLayFrm, nRelPosX );
840 :
841 : // if object is a Writer fly frame and it's anchored to a content and
842 : // it is horizontal positioned left or right, but not relative to character,
843 : // it has to be drawn aside another object, which have the same horizontal
844 : // position and lay below it.
845 11632 : if ( GetAnchoredObj().ISA(SwFlyFrm) &&
846 5533 : ( GetContact().ObjAnchoredAtPara() || GetContact().ObjAnchoredAtChar() ) &&
847 9552 : ( eHoriOrient == text::HoriOrientation::LEFT || eHoriOrient == text::HoriOrientation::RIGHT ) &&
848 51 : eRelOrient != text::RelOrientation::CHAR )
849 : {
850 : nRelPosX = _AdjustHoriRelPosForDrawAside( _rHoriOrientFrm,
851 : nRelPosX, _nRelPosY,
852 : eHoriOrient, eRelOrient,
853 : _rLRSpacing, _rULSpacing,
854 51 : bEvenPage );
855 : }
856 :
857 : // #i26791#
858 4587 : _roHoriOffsetToFrmAnchorPos = nOffset;
859 :
860 4587 : return nRelPosX;
861 : }
862 :
863 : // method incl. helper methods for adjusting proposed horizontal position,
864 : // if object has to draw aside another object.
865 : /** adjust calculated horizontal position in order to draw object
866 : aside other objects with same positioning
867 : */
868 51 : SwTwips SwAnchoredObjectPosition::_AdjustHoriRelPosForDrawAside(
869 : const SwFrm& _rHoriOrientFrm,
870 : const SwTwips _nProposedRelPosX,
871 : const SwTwips _nRelPosY,
872 : const sal_Int16 _eHoriOrient,
873 : const sal_Int16 _eRelOrient,
874 : const SvxLRSpaceItem& _rLRSpacing,
875 : const SvxULSpaceItem& _rULSpacing,
876 : const bool _bEvenPage
877 : ) const
878 : {
879 : // #i26791#
880 102 : if ( !GetAnchorFrm().ISA(SwTextFrm) ||
881 51 : !GetAnchoredObj().ISA(SwFlyAtCntFrm) )
882 : {
883 : OSL_FAIL( "<SwAnchoredObjectPosition::_AdjustHoriRelPosForDrawAside(..) - usage for wrong anchor type" );
884 0 : return _nProposedRelPosX;
885 : }
886 :
887 51 : const SwTextFrm& rAnchorTextFrm = static_cast<const SwTextFrm&>(GetAnchorFrm());
888 : // #i26791#
889 : const SwFlyAtCntFrm& rFlyAtCntFrm =
890 51 : static_cast<const SwFlyAtCntFrm&>(GetAnchoredObj());
891 51 : const SwRect aObjBoundRect( GetAnchoredObj().GetObjRect() );
892 51 : SWRECTFN( (&_rHoriOrientFrm) )
893 :
894 51 : SwTwips nAdjustedRelPosX = _nProposedRelPosX;
895 :
896 : // determine proposed object bound rectangle
897 51 : Point aTmpPos = (rAnchorTextFrm.Frm().*fnRect->fnGetPos)();
898 51 : if( bVert )
899 : {
900 0 : aTmpPos.X() -= _nRelPosY + aObjBoundRect.Width();
901 0 : aTmpPos.Y() += nAdjustedRelPosX;
902 : }
903 : else
904 : {
905 51 : aTmpPos.X() += nAdjustedRelPosX;
906 51 : aTmpPos.Y() += _nRelPosY;
907 : }
908 51 : SwRect aTmpObjRect( aTmpPos, aObjBoundRect.SSize() );
909 :
910 51 : const sal_uInt32 nObjOrdNum = GetObject().GetOrdNum();
911 51 : const SwPageFrm* pObjPage = rFlyAtCntFrm.FindPageFrm();
912 51 : const SwFrm* pObjContext = ::FindKontext( &rAnchorTextFrm, FRM_COLUMN );
913 51 : sal_uLong nObjIndex = rAnchorTextFrm.GetTextNode()->GetIndex();
914 51 : SwOrderIter aIter( pObjPage, true );
915 51 : const SwFlyFrm* pFly = static_cast<const SwVirtFlyDrawObj*>(aIter.Bottom())->GetFlyFrm();
916 102 : while ( pFly && nObjOrdNum > pFly->GetVirtDrawObj()->GetOrdNumDirect() )
917 : {
918 0 : if ( _DrawAsideFly( pFly, aTmpObjRect, pObjContext, nObjIndex,
919 0 : _bEvenPage, _eHoriOrient, _eRelOrient ) )
920 : {
921 0 : if( bVert )
922 : {
923 0 : const SvxULSpaceItem& rOtherUL = pFly->GetFormat()->GetULSpace();
924 0 : const SwTwips nOtherTop = pFly->Frm().Top() - rOtherUL.GetUpper();
925 0 : const SwTwips nOtherBot = pFly->Frm().Bottom() + rOtherUL.GetLower();
926 0 : if ( nOtherTop <= aTmpObjRect.Bottom() + _rULSpacing.GetLower() &&
927 0 : nOtherBot >= aTmpObjRect.Top() - _rULSpacing.GetUpper() )
928 : {
929 0 : if ( _eHoriOrient == text::HoriOrientation::LEFT )
930 : {
931 0 : SwTwips nTmp = nOtherBot + 1 + _rULSpacing.GetUpper() -
932 0 : rAnchorTextFrm.Frm().Top();
933 0 : if ( nTmp > nAdjustedRelPosX &&
934 0 : rAnchorTextFrm.Frm().Top() + nTmp +
935 0 : aObjBoundRect.Height() + _rULSpacing.GetLower()
936 0 : <= pObjPage->Frm().Height() + pObjPage->Frm().Top() )
937 : {
938 0 : nAdjustedRelPosX = nTmp;
939 : }
940 : }
941 0 : else if ( _eHoriOrient == text::HoriOrientation::RIGHT )
942 : {
943 0 : SwTwips nTmp = nOtherTop - 1 - _rULSpacing.GetLower() -
944 0 : aObjBoundRect.Height() -
945 0 : rAnchorTextFrm.Frm().Top();
946 0 : if ( nTmp < nAdjustedRelPosX &&
947 0 : rAnchorTextFrm.Frm().Top() + nTmp - _rULSpacing.GetUpper()
948 0 : >= pObjPage->Frm().Top() )
949 : {
950 0 : nAdjustedRelPosX = nTmp;
951 : }
952 : }
953 0 : aTmpObjRect.Pos().Y() = rAnchorTextFrm.Frm().Top() +
954 0 : nAdjustedRelPosX;
955 : }
956 : }
957 : else
958 : {
959 0 : const SvxLRSpaceItem& rOtherLR = pFly->GetFormat()->GetLRSpace();
960 0 : const SwTwips nOtherLeft = pFly->Frm().Left() - rOtherLR.GetLeft();
961 0 : const SwTwips nOtherRight = pFly->Frm().Right() + rOtherLR.GetRight();
962 0 : if( nOtherLeft <= aTmpObjRect.Right() + _rLRSpacing.GetRight() &&
963 0 : nOtherRight >= aTmpObjRect.Left() - _rLRSpacing.GetLeft() )
964 : {
965 0 : if ( _eHoriOrient == text::HoriOrientation::LEFT )
966 : {
967 0 : SwTwips nTmp = nOtherRight + 1 + _rLRSpacing.GetLeft() -
968 0 : rAnchorTextFrm.Frm().Left();
969 0 : if ( nTmp > nAdjustedRelPosX &&
970 0 : rAnchorTextFrm.Frm().Left() + nTmp +
971 0 : aObjBoundRect.Width() + _rLRSpacing.GetRight()
972 0 : <= pObjPage->Frm().Width() + pObjPage->Frm().Left() )
973 : {
974 0 : nAdjustedRelPosX = nTmp;
975 : }
976 : }
977 0 : else if ( _eHoriOrient == text::HoriOrientation::RIGHT )
978 : {
979 0 : SwTwips nTmp = nOtherLeft - 1 - _rLRSpacing.GetRight() -
980 0 : aObjBoundRect.Width() -
981 0 : rAnchorTextFrm.Frm().Left();
982 0 : if ( nTmp < nAdjustedRelPosX &&
983 0 : rAnchorTextFrm.Frm().Left() + nTmp - _rLRSpacing.GetLeft()
984 0 : >= pObjPage->Frm().Left() )
985 : {
986 0 : nAdjustedRelPosX = nTmp;
987 : }
988 : }
989 0 : aTmpObjRect.Pos().X() = rAnchorTextFrm.Frm().Left() +
990 0 : nAdjustedRelPosX;
991 : }
992 : } // end of <if (bVert)>
993 : } // end of <if _DrawAsideFly(..)>
994 :
995 0 : pFly = static_cast<const SwVirtFlyDrawObj*>(aIter.Next())->GetFlyFrm();
996 : } // end of <loop on fly frames
997 :
998 51 : return nAdjustedRelPosX;
999 : }
1000 :
1001 : /** detemine, if object has to draw aside given fly frame
1002 :
1003 : method used by <_AdjustHoriRelPosForDrawAside(..)>
1004 : */
1005 0 : bool SwAnchoredObjectPosition::_DrawAsideFly( const SwFlyFrm* _pFly,
1006 : const SwRect& _rObjRect,
1007 : const SwFrm* _pObjContext,
1008 : const sal_uLong _nObjIndex,
1009 : const bool _bEvenPage,
1010 : const sal_Int16 _eHoriOrient,
1011 : const sal_Int16 _eRelOrient
1012 : ) const
1013 : {
1014 0 : bool bRetVal = false;
1015 :
1016 0 : SWRECTFN( (&GetAnchorFrm()) )
1017 :
1018 0 : if ( _pFly->IsFlyAtCntFrm() &&
1019 0 : (_pFly->Frm().*fnRect->fnBottomDist)( (_rObjRect.*fnRect->fnGetTop)() ) < 0 &&
1020 0 : (_rObjRect.*fnRect->fnBottomDist)( (_pFly->Frm().*fnRect->fnGetTop)() ) < 0 &&
1021 0 : ::FindKontext( _pFly->GetAnchorFrm(), FRM_COLUMN ) == _pObjContext )
1022 : {
1023 : sal_uLong nOtherIndex =
1024 0 : static_cast<const SwTextFrm*>(_pFly->GetAnchorFrm())->GetTextNode()->GetIndex();
1025 0 : if( _nObjIndex >= nOtherIndex )
1026 : {
1027 0 : const SwFormatHoriOrient& rHori = _pFly->GetFormat()->GetHoriOrient();
1028 0 : sal_Int16 eOtherRelOrient = rHori.GetRelationOrient();
1029 0 : if( text::RelOrientation::CHAR != eOtherRelOrient )
1030 : {
1031 0 : sal_Int16 eOtherHoriOrient = rHori.GetHoriOrient();
1032 0 : _ToggleHoriOrientAndAlign( _bEvenPage && rHori.IsPosToggle(),
1033 : eOtherHoriOrient,
1034 0 : eOtherRelOrient );
1035 0 : if ( eOtherHoriOrient == _eHoriOrient &&
1036 0 : _Minor( _eRelOrient, eOtherRelOrient, text::HoriOrientation::LEFT == _eHoriOrient ) )
1037 : {
1038 0 : bRetVal = true;
1039 : }
1040 : }
1041 : }
1042 : }
1043 :
1044 0 : return bRetVal;
1045 : }
1046 :
1047 : /** determine, if object has to draw aside another object
1048 :
1049 : the different alignments of the objects determines, if one has
1050 : to draw aside another one. Thus, the given alignment are checked
1051 : against each other, which one has to be drawn aside the other one.
1052 : depending on parameter _bLeft check is done for left or right
1053 : positioning.
1054 : method used by <_DrawAsideFly(..)>
1055 : */
1056 0 : bool SwAnchoredObjectPosition::_Minor( sal_Int16 _eRelOrient1,
1057 : sal_Int16 _eRelOrient2,
1058 : bool _bLeft )
1059 : {
1060 : bool bRetVal;
1061 :
1062 : // draw aside order for left horizontal position
1063 : //! one array entry for each value in text::RelOrientation
1064 : static sal_uInt16 const aLeft[ 10 ] =
1065 : { 5, 6, 0, 1, 8, 4, 7, 2, 3, 9 };
1066 : // draw aside order for right horizontal position
1067 : //! one array entry for each value in text::RelOrientation
1068 : static sal_uInt16 const aRight[ 10 ] =
1069 : { 5, 6, 0, 8, 1, 7, 4, 2, 3, 9 };
1070 :
1071 : // decide depending on given order, which frame has to draw aside another frame
1072 0 : if( _bLeft )
1073 0 : bRetVal = aLeft[ _eRelOrient1 ] >= aLeft[ _eRelOrient2 ];
1074 : else
1075 0 : bRetVal = aRight[ _eRelOrient1 ] >= aRight[ _eRelOrient2 ];
1076 :
1077 0 : return bRetVal;
1078 177 : }
1079 :
1080 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|