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 <tools/poly.hxx>
21 : #include <vcl/metric.hxx>
22 : #include <vcl/svapp.hxx>
23 : #include <svtools/colorcfg.hxx>
24 : #include <svx/swframeexample.hxx>
25 : #include <com/sun/star/text/TextContentAnchorType.hpp>
26 : #include <com/sun/star/text/HoriOrientation.hpp>
27 : #include <com/sun/star/text/VertOrientation.hpp>
28 : #include <com/sun/star/text/RelOrientation.hpp>
29 : #include <com/sun/star/text/WrapTextMode.hpp>
30 :
31 : using namespace ::com::sun::star::text;
32 :
33 : #define FLYINFLY_BORDER 3
34 : #define DEMOTEXT "Ij"
35 :
36 0 : SvxSwFrameExample::SvxSwFrameExample( Window *pParent, const ResId& rResID ) :
37 :
38 : Window(pParent, rResID),
39 :
40 : nHAlign (HoriOrientation::CENTER),
41 : nHRel (RelOrientation::FRAME),
42 : nVAlign (VertOrientation::TOP),
43 : nVRel (RelOrientation::PRINT_AREA),
44 : nWrap (WrapTextMode_NONE),
45 : nAnchor (TextContentAnchorType_AT_PAGE),
46 : bTrans (sal_False),
47 0 : aRelPos (Point(0,0))
48 : {
49 0 : InitColors_Impl();
50 0 : SetMapMode(MAP_PIXEL);
51 0 : }
52 :
53 0 : SvxSwFrameExample::~SvxSwFrameExample()
54 : {
55 0 : }
56 :
57 0 : void SvxSwFrameExample::InitColors_Impl( void )
58 : {
59 0 : const StyleSettings& rSettings = GetSettings().GetStyleSettings();
60 0 : m_aBgCol = Color( rSettings.GetWindowColor() );
61 :
62 0 : sal_Bool bHC = rSettings.GetHighContrastMode();
63 :
64 0 : m_aFrameColor = Color( COL_LIGHTGREEN );
65 0 : m_aAlignColor = Color( COL_LIGHTRED );
66 0 : m_aTransColor = Color( COL_TRANSPARENT );
67 :
68 : m_aTxtCol = bHC?
69 0 : svtools::ColorConfig().GetColorValue(svtools::FONTCOLOR).nColor :
70 0 : Color( COL_GRAY );
71 0 : m_aPrintAreaCol = bHC? m_aTxtCol : Color( COL_GRAY );
72 0 : m_aBorderCol = m_aTxtCol;
73 0 : m_aBlankCol = bHC? m_aTxtCol : Color( COL_LIGHTGRAY );
74 0 : m_aBlankFrameCol = bHC? m_aTxtCol : Color( COL_GRAY );
75 0 : }
76 :
77 0 : void SvxSwFrameExample::DataChanged( const DataChangedEvent& rDCEvt )
78 : {
79 0 : Window::DataChanged( rDCEvt );
80 :
81 0 : if( rDCEvt.GetType() == DATACHANGED_SETTINGS && ( rDCEvt.GetFlags() & SETTINGS_STYLE ) )
82 0 : InitColors_Impl();
83 0 : }
84 :
85 0 : void SvxSwFrameExample::InitAllRects_Impl()
86 : {
87 0 : aPage.SetSize( GetOutputSizePixel() );
88 :
89 0 : sal_uIntPtr nOutWPix = aPage.GetWidth();
90 0 : sal_uIntPtr nOutHPix = aPage.GetHeight();
91 :
92 : // PrintArea
93 : sal_uIntPtr nLBorder;
94 : sal_uIntPtr nRBorder;
95 : sal_uIntPtr nTBorder;
96 : sal_uIntPtr nBBorder;
97 :
98 : sal_uIntPtr nLTxtBorder;
99 : sal_uIntPtr nRTxtBorder;
100 : sal_uIntPtr nTTxtBorder;
101 : sal_uIntPtr nBTxtBorder;
102 :
103 0 : if (nAnchor != TextContentAnchorType_AS_CHARACTER)
104 : {
105 0 : nLBorder = 14;
106 0 : nRBorder = 10;
107 0 : nTBorder = 10;
108 0 : nBBorder = 15;
109 :
110 0 : nLTxtBorder = 8;
111 0 : nRTxtBorder = 4;
112 0 : nTTxtBorder = 2;
113 0 : nBTxtBorder = 2;
114 : }
115 : else
116 : {
117 0 : nLBorder = 2;
118 0 : nRBorder = 2;
119 0 : nTBorder = 2;
120 0 : nBBorder = 2;
121 :
122 0 : nLTxtBorder = 2;
123 0 : nRTxtBorder = 2;
124 0 : nTTxtBorder = 2;
125 0 : nBTxtBorder = 2;
126 : }
127 0 : aPagePrtArea = Rectangle(Point(nLBorder, nTBorder), Point((nOutWPix - 1) - nRBorder, (nOutHPix - 1) - nBBorder));
128 :
129 : // Example text: Preparing for the text output
130 : // A line of text
131 0 : aTextLine = aPagePrtArea;
132 0 : aTextLine.SetSize(Size(aTextLine.GetWidth(), 2));
133 0 : aTextLine.Left() += nLTxtBorder;
134 0 : aTextLine.Right() -= nRTxtBorder;
135 0 : aTextLine.Move(0, nTTxtBorder);
136 :
137 : // Rectangle to edges including paragraph
138 0 : sal_uInt16 nLines = (sal_uInt16)((aPagePrtArea.GetHeight() / 2 - nTTxtBorder - nBTxtBorder)
139 0 : / (aTextLine.GetHeight() + 2));
140 0 : aPara = aPagePrtArea;
141 : aPara.SetSize(Size(aPara.GetWidth(),
142 0 : (aTextLine.GetHeight() + 2) * nLines + nTTxtBorder + nBTxtBorder));
143 :
144 : // Rectangle around paragraph without borders
145 0 : aParaPrtArea = aPara;
146 0 : aParaPrtArea.Left() += nLTxtBorder;
147 0 : aParaPrtArea.Right() -= nRTxtBorder;
148 0 : aParaPrtArea.Top() += nTTxtBorder;
149 0 : aParaPrtArea.Bottom() -= nBTxtBorder;
150 :
151 0 : if (nAnchor == TextContentAnchorType_AS_CHARACTER || nAnchor == TextContentAnchorType_AT_CHARACTER)
152 : {
153 : Font aFont = OutputDevice::GetDefaultFont(
154 0 : DEFAULTFONT_LATIN_TEXT, Application::GetSettings().GetLanguageTag().getLanguageType(),
155 0 : DEFAULTFONT_FLAGS_ONLYONE, this );
156 0 : aFont.SetColor( m_aTxtCol );
157 0 : aFont.SetFillColor( m_aBgCol );
158 0 : aFont.SetWeight(WEIGHT_NORMAL);
159 :
160 0 : if (nAnchor == TextContentAnchorType_AS_CHARACTER)
161 : {
162 0 : aFont.SetSize(Size(0, aParaPrtArea.GetHeight() - 2));
163 0 : SetFont(aFont);
164 0 : aParaPrtArea.SetSize(Size(GetTextWidth(rtl::OUString(DEMOTEXT)), GetTextHeight()));
165 : }
166 : else
167 : {
168 0 : aFont.SetSize(Size(0, aParaPrtArea.GetHeight() / 2));
169 0 : SetFont(aFont);
170 0 : aAutoCharFrame.SetSize(Size(GetTextWidth(rtl::OUString('A')), GetTextHeight()));
171 0 : aAutoCharFrame.SetPos(Point(aParaPrtArea.Left() + (aParaPrtArea.GetWidth() - aAutoCharFrame.GetWidth()) / 2,
172 0 : aParaPrtArea.Top() + (aParaPrtArea.GetHeight() - aAutoCharFrame.GetHeight()) / 2));
173 0 : }
174 : }
175 :
176 : // Inner Frame anchored at the Frame
177 0 : aFrameAtFrame = aPara;
178 0 : aFrameAtFrame.Left() += 9;
179 0 : aFrameAtFrame.Right() -= 5;
180 0 : aFrameAtFrame.Bottom() += 5;
181 0 : aFrameAtFrame.SetPos(Point(aFrameAtFrame.Left() + 2, (aPagePrtArea.Bottom() - aFrameAtFrame.GetHeight()) / 2 + 5));
182 :
183 : // Size of the frame to be positioned
184 0 : if (nAnchor != TextContentAnchorType_AS_CHARACTER)
185 : {
186 0 : sal_uIntPtr nLFBorder = nAnchor == TextContentAnchorType_AT_PAGE ? nLBorder : nLTxtBorder;
187 0 : sal_uIntPtr nRFBorder = nAnchor == TextContentAnchorType_AT_PAGE ? nRBorder : nRTxtBorder;
188 :
189 0 : switch (nHRel)
190 : {
191 : case RelOrientation::PAGE_LEFT:
192 : case RelOrientation::FRAME_LEFT:
193 0 : aFrmSize = Size(nLFBorder - 4, (aTextLine.GetHeight() + 2) * 3);
194 0 : break;
195 :
196 : case RelOrientation::PAGE_RIGHT:
197 : case RelOrientation::FRAME_RIGHT:
198 0 : aFrmSize = Size(nRFBorder - 4, (aTextLine.GetHeight() + 2) * 3);
199 0 : break;
200 :
201 : default:
202 0 : aFrmSize = Size(nLBorder - 3, (aTextLine.GetHeight() + 2) * 3);
203 0 : break;
204 : }
205 0 : aFrmSize.Width() = Max(5L, aFrmSize.Width());
206 0 : aFrmSize.Height() = Max(5L, aFrmSize.Height());
207 : }
208 : else
209 : {
210 0 : sal_uIntPtr nFreeWidth = aPagePrtArea.GetWidth() - GetTextWidth(rtl::OUString(DEMOTEXT));
211 :
212 0 : aFrmSize = Size(nFreeWidth / 2, (aTextLine.GetHeight() + 2) * 3);
213 0 : aDrawObj.SetSize(Size(Max(5L, (long)nFreeWidth / 3L), Max(5L, aFrmSize.Height() * 3L)));
214 0 : aDrawObj.SetPos(Point(aParaPrtArea.Right() + 1, aParaPrtArea.Bottom() / 2));
215 0 : aParaPrtArea.Right() = aDrawObj.Right();
216 : }
217 0 : }
218 :
219 0 : void SvxSwFrameExample::CalcBoundRect_Impl(Rectangle &rRect)
220 : {
221 0 : switch (nAnchor)
222 : {
223 : case TextContentAnchorType_AT_PAGE:
224 : {
225 0 : switch (nHRel)
226 : {
227 : case RelOrientation::FRAME:
228 : case RelOrientation::PAGE_FRAME:
229 0 : rRect.Left() = aPage.Left();
230 0 : rRect.Right() = aPage.Right();
231 0 : break;
232 :
233 : case RelOrientation::PRINT_AREA:
234 : case RelOrientation::PAGE_PRINT_AREA:
235 0 : rRect.Left() = aPagePrtArea.Left();
236 0 : rRect.Right() = aPagePrtArea.Right();
237 0 : break;
238 :
239 : case RelOrientation::PAGE_LEFT:
240 0 : rRect.Left() = aPage.Left();
241 0 : rRect.Right() = aPagePrtArea.Left();
242 0 : break;
243 :
244 : case RelOrientation::PAGE_RIGHT:
245 0 : rRect.Left() = aPagePrtArea.Right();
246 0 : rRect.Right() = aPage.Right();
247 0 : break;
248 : }
249 :
250 0 : switch (nVRel)
251 : {
252 : case RelOrientation::PRINT_AREA:
253 : case RelOrientation::PAGE_PRINT_AREA:
254 0 : rRect.Top() = aPagePrtArea.Top();
255 0 : rRect.Bottom() = aPagePrtArea.Bottom();
256 0 : break;
257 :
258 : case RelOrientation::FRAME:
259 : case RelOrientation::PAGE_FRAME:
260 0 : rRect.Top() = aPage.Top();
261 0 : rRect.Bottom() = aPage.Bottom();
262 0 : break;
263 : }
264 : }
265 0 : break;
266 :
267 : case TextContentAnchorType_AT_FRAME:
268 : {
269 0 : switch (nHRel)
270 : {
271 : case RelOrientation::FRAME:
272 : case RelOrientation::PAGE_FRAME:
273 0 : rRect.Left() = aFrameAtFrame.Left();
274 0 : rRect.Right() = aFrameAtFrame.Right();
275 0 : break;
276 :
277 : case RelOrientation::PRINT_AREA:
278 : case RelOrientation::PAGE_PRINT_AREA:
279 0 : rRect.Left() = aFrameAtFrame.Left() + FLYINFLY_BORDER;
280 0 : rRect.Right() = aFrameAtFrame.Right() - FLYINFLY_BORDER;
281 0 : break;
282 :
283 : case RelOrientation::PAGE_RIGHT:
284 0 : rRect.Left() = aFrameAtFrame.Left();
285 0 : rRect.Right() = aFrameAtFrame.Left() + FLYINFLY_BORDER;
286 0 : break;
287 :
288 : case RelOrientation::PAGE_LEFT:
289 0 : rRect.Left() = aFrameAtFrame.Right();
290 0 : rRect.Right() = aFrameAtFrame.Right() - FLYINFLY_BORDER;
291 0 : break;
292 : }
293 :
294 0 : switch (nVRel)
295 : {
296 : case RelOrientation::FRAME:
297 : case RelOrientation::PAGE_FRAME:
298 0 : rRect.Top() = aFrameAtFrame.Top();
299 0 : rRect.Bottom() = aFrameAtFrame.Bottom();
300 0 : break;
301 :
302 : case RelOrientation::PRINT_AREA:
303 : case RelOrientation::PAGE_PRINT_AREA:
304 0 : rRect.Top() = aFrameAtFrame.Top() + FLYINFLY_BORDER;
305 0 : rRect.Bottom() = aFrameAtFrame.Bottom() - FLYINFLY_BORDER;
306 0 : break;
307 : }
308 : }
309 0 : break;
310 : case TextContentAnchorType_AT_PARAGRAPH:
311 : case TextContentAnchorType_AT_CHARACTER:
312 : {
313 0 : switch (nHRel)
314 : {
315 : case RelOrientation::FRAME:
316 0 : rRect.Left() = aPara.Left();
317 0 : rRect.Right() = aPara.Right();
318 0 : break;
319 :
320 : case RelOrientation::PRINT_AREA:
321 0 : rRect.Left() = aParaPrtArea.Left();
322 0 : rRect.Right() = aParaPrtArea.Right();
323 0 : break;
324 :
325 : case RelOrientation::PAGE_LEFT:
326 0 : rRect.Left() = aPage.Left();
327 0 : rRect.Right() = aPagePrtArea.Left();
328 0 : break;
329 :
330 : case RelOrientation::PAGE_RIGHT:
331 0 : rRect.Left() = aPagePrtArea.Right();
332 0 : rRect.Right() = aPage.Right();
333 0 : break;
334 :
335 : case RelOrientation::PAGE_FRAME:
336 0 : rRect.Left() = aPage.Left();
337 0 : rRect.Right() = aPage.Right();
338 0 : break;
339 :
340 : case RelOrientation::PAGE_PRINT_AREA:
341 0 : rRect.Left() = aPagePrtArea.Left();
342 0 : rRect.Right() = aPagePrtArea.Right();
343 0 : break;
344 :
345 : case RelOrientation::FRAME_LEFT:
346 0 : rRect.Left() = aPara.Left();
347 0 : rRect.Right() = aParaPrtArea.Left();
348 0 : break;
349 :
350 : case RelOrientation::FRAME_RIGHT:
351 0 : rRect.Left() = aParaPrtArea.Right();
352 0 : rRect.Right() = aPara.Right();
353 0 : break;
354 :
355 : case RelOrientation::CHAR:
356 0 : rRect.Left() = aAutoCharFrame.Left();
357 0 : rRect.Right() = aAutoCharFrame.Left();
358 0 : break;
359 : }
360 :
361 0 : switch (nVRel)
362 : {
363 : case RelOrientation::FRAME:
364 0 : rRect.Top() = aPara.Top();
365 0 : rRect.Bottom() = aPara.Bottom();
366 0 : break;
367 :
368 : case RelOrientation::PRINT_AREA:
369 0 : rRect.Top() = aParaPrtArea.Top();
370 0 : rRect.Bottom() = aParaPrtArea.Bottom();
371 0 : break;
372 :
373 : case RelOrientation::CHAR:
374 0 : if (nVAlign != VertOrientation::NONE &&
375 : nVAlign != VertOrientation::CHAR_BOTTOM)
376 0 : rRect.Top() = aAutoCharFrame.Top();
377 : else
378 0 : rRect.Top() = aAutoCharFrame.Bottom();
379 0 : rRect.Bottom() = aAutoCharFrame.Bottom();
380 0 : break;
381 : // OD 12.11.2003 #i22341#
382 : case RelOrientation::TEXT_LINE:
383 0 : rRect.Top() = aAutoCharFrame.Top();
384 0 : rRect.Bottom() = aAutoCharFrame.Top();
385 0 : break;
386 : }
387 : }
388 0 : break;
389 :
390 : case TextContentAnchorType_AS_CHARACTER:
391 0 : rRect.Left() = aParaPrtArea.Left();
392 0 : rRect.Right() = aParaPrtArea.Right();
393 :
394 0 : switch (nVAlign)
395 : {
396 : case VertOrientation::NONE:
397 : case VertOrientation::TOP:
398 : case VertOrientation::CENTER:
399 : case VertOrientation::BOTTOM:
400 : {
401 0 : FontMetric aMetric(GetFontMetric());
402 :
403 0 : rRect.Top() = aParaPrtArea.Bottom() - aMetric.GetDescent();
404 0 : rRect.Bottom() = rRect.Top();
405 : }
406 0 : break;
407 :
408 : default:
409 :
410 : case VertOrientation::LINE_TOP:
411 : case VertOrientation::LINE_CENTER:
412 : case VertOrientation::LINE_BOTTOM:
413 0 : rRect.Top() = aParaPrtArea.Top();
414 0 : rRect.Bottom() = aDrawObj.Bottom();
415 0 : break;
416 :
417 : case VertOrientation::CHAR_TOP:
418 : case VertOrientation::CHAR_CENTER:
419 : case VertOrientation::CHAR_BOTTOM:
420 0 : rRect.Top() = aParaPrtArea.Top();
421 0 : rRect.Bottom() = aParaPrtArea.Bottom();
422 0 : break;
423 : }
424 0 : break;
425 :
426 : default:
427 0 : break;
428 : }
429 0 : }
430 :
431 0 : Rectangle SvxSwFrameExample::DrawInnerFrame_Impl(const Rectangle &rRect, const Color &rFillColor, const Color &rBorderColor)
432 : {
433 0 : DrawRect_Impl(rRect, rFillColor, rBorderColor);
434 :
435 : // Bereich, zu dem relativ positioniert wird, bestimmen
436 0 : Rectangle aRect(rRect); // aPagePrtArea = Default
437 0 : CalcBoundRect_Impl(aRect);
438 :
439 0 : if (nAnchor == TextContentAnchorType_AT_FRAME && &rRect == &aPagePrtArea)
440 : {
441 : // Testabsatz zeichnen
442 0 : Rectangle aTxt(aTextLine);
443 0 : sal_Int32 nStep = aTxt.GetHeight() + 2;
444 0 : sal_uInt16 nLines = (sal_uInt16)(aParaPrtArea.GetHeight() / (aTextLine.GetHeight() + 2));
445 :
446 0 : for (sal_uInt16 i = 0; i < nLines; i++)
447 : {
448 0 : if (i == nLines - 1)
449 0 : aTxt.SetSize(Size(aTxt.GetWidth() / 2, aTxt.GetHeight()));
450 0 : DrawRect_Impl(aTxt, m_aTxtCol, m_aTransColor);
451 0 : aTxt.Move(0, nStep);
452 : }
453 : }
454 :
455 0 : return aRect;
456 : }
457 :
458 0 : void SvxSwFrameExample::Paint(const Rectangle&)
459 : {
460 0 : InitAllRects_Impl();
461 :
462 : // Draw page
463 0 : DrawRect_Impl( aPage, m_aBgCol, m_aBorderCol );
464 :
465 : // Draw PrintArea
466 0 : Rectangle aRect = DrawInnerFrame_Impl( aPagePrtArea, m_aTransColor, m_aPrintAreaCol );
467 :
468 0 : if (nAnchor == TextContentAnchorType_AT_FRAME)
469 0 : aRect = DrawInnerFrame_Impl( aFrameAtFrame, m_aBgCol, m_aBorderCol );
470 :
471 0 : long lXPos = 0;
472 0 : long lYPos = 0;
473 :
474 : // Horizontal alignment
475 0 : if (nAnchor != TextContentAnchorType_AS_CHARACTER)
476 : {
477 0 : switch (nHAlign)
478 : {
479 : case HoriOrientation::RIGHT:
480 : {
481 0 : lXPos = aRect.Right() - aFrmSize.Width() + 1;
482 0 : break;
483 : }
484 : case HoriOrientation::CENTER:
485 : {
486 0 : lXPos = aRect.Left() + (aRect.GetWidth() - aFrmSize.Width()) / 2;
487 0 : break;
488 : }
489 : case HoriOrientation::NONE:
490 : {
491 0 : lXPos = aRect.Left() + aRelPos.X();
492 0 : break;
493 : }
494 :
495 : default: // HoriOrientation::LEFT
496 0 : lXPos = aRect.Left();
497 0 : break;
498 : }
499 : }
500 : else
501 0 : lXPos = aRect.Right() + 2;
502 :
503 : // Vertical Alignment
504 0 : if (nAnchor != TextContentAnchorType_AS_CHARACTER)
505 : {
506 0 : switch (nVAlign)
507 : {
508 : case VertOrientation::BOTTOM:
509 : case VertOrientation::LINE_BOTTOM:
510 : {
511 : // #i22341#
512 0 : if ( nVRel != RelOrientation::TEXT_LINE )
513 : {
514 0 : lYPos = aRect.Bottom() - aFrmSize.Height() + 1;
515 : }
516 : else
517 : {
518 0 : lYPos = aRect.Top();
519 : }
520 0 : break;
521 : }
522 : case VertOrientation::CENTER:
523 : case VertOrientation::LINE_CENTER:
524 : {
525 0 : lYPos = aRect.Top() + (aRect.GetHeight() - aFrmSize.Height()) / 2;
526 0 : break;
527 : }
528 : case VertOrientation::NONE:
529 : {
530 : // #i22341#
531 0 : if ( nVRel != RelOrientation::CHAR && nVRel != RelOrientation::TEXT_LINE )
532 0 : lYPos = aRect.Top() + aRelPos.Y();
533 : else
534 0 : lYPos = aRect.Top() - aRelPos.Y();
535 0 : break;
536 : }
537 : default:
538 : // #i22341#
539 0 : if ( nVRel != RelOrientation::TEXT_LINE )
540 : {
541 0 : lYPos = aRect.Top();
542 : }
543 : else
544 : {
545 0 : lYPos = aRect.Bottom() - aFrmSize.Height() + 1;
546 : }
547 0 : break;
548 : }
549 : }
550 : else
551 : {
552 0 : switch(nVAlign)
553 : {
554 : case VertOrientation::CENTER:
555 : case VertOrientation::CHAR_CENTER:
556 : case VertOrientation::LINE_CENTER:
557 0 : lYPos = aRect.Top() + (aRect.GetHeight() - aFrmSize.Height()) / 2;
558 0 : break;
559 :
560 : case VertOrientation::TOP:
561 : case VertOrientation::CHAR_BOTTOM:
562 : case VertOrientation::LINE_BOTTOM:
563 0 : lYPos = aRect.Bottom() - aFrmSize.Height() + 1;
564 0 : break;
565 :
566 : default:
567 0 : lYPos = aRect.Top() - aRelPos.Y();
568 0 : break;
569 : }
570 : }
571 :
572 0 : Rectangle aFrmRect(Point(lXPos, lYPos), aFrmSize);
573 :
574 0 : Rectangle *pOuterFrame = &aPage;
575 :
576 0 : if (nAnchor == TextContentAnchorType_AT_FRAME)
577 0 : pOuterFrame = &aFrameAtFrame;
578 :
579 0 : if (aFrmRect.Left() < pOuterFrame->Left())
580 0 : aFrmRect.Move(pOuterFrame->Left() - aFrmRect.Left(), 0);
581 0 : if (aFrmRect.Right() > pOuterFrame->Right())
582 0 : aFrmRect.Move(pOuterFrame->Right() - aFrmRect.Right(), 0);
583 :
584 0 : if (aFrmRect.Top() < pOuterFrame->Top())
585 0 : aFrmRect.Move(0, pOuterFrame->Top() - aFrmRect.Top());
586 0 : if (aFrmRect.Bottom() > pOuterFrame->Bottom())
587 0 : aFrmRect.Move(0, pOuterFrame->Bottom() - aFrmRect.Bottom());
588 :
589 : // Draw Test paragraph
590 0 : const long nTxtLineHeight = aTextLine.GetHeight();
591 0 : Rectangle aTxt(aTextLine);
592 : sal_Int32 nStep;
593 : sal_uInt16 nLines;
594 :
595 0 : if (nAnchor == TextContentAnchorType_AT_FRAME)
596 : {
597 0 : aTxt.Left() = aFrameAtFrame.Left() + FLYINFLY_BORDER;
598 0 : aTxt.Right() = aFrameAtFrame.Right() - FLYINFLY_BORDER;
599 0 : aTxt.Top() = aFrameAtFrame.Top() + FLYINFLY_BORDER;
600 0 : aTxt.Bottom() = aTxt.Top() + aTextLine.GetHeight() - 1;
601 :
602 0 : nStep = aTxt.GetHeight() + 2;
603 0 : nLines = (sal_uInt16)(((aFrameAtFrame.GetHeight() - 2 * FLYINFLY_BORDER) * 2 / 3)
604 0 : / (aTxt.GetHeight() + 2));
605 : }
606 : else
607 : {
608 0 : nStep = aTxt.GetHeight() + 2;
609 0 : nLines = (sal_uInt16)(aParaPrtArea.GetHeight() / (aTextLine.GetHeight() + 2));
610 : }
611 :
612 0 : if (nAnchor != TextContentAnchorType_AS_CHARACTER)
613 : {
614 : // Simulate text
615 0 : const long nOldR = aTxt.Right();
616 0 : const long nOldL = aTxt.Left();
617 :
618 : // #i22341#
619 : const bool bIgnoreWrap = nAnchor == TextContentAnchorType_AT_CHARACTER &&
620 : ( nHRel == RelOrientation::CHAR || nVRel == RelOrientation::CHAR ||
621 0 : nVRel == RelOrientation::TEXT_LINE );
622 :
623 0 : for (sal_uInt16 i = 0; i < nLines; ++i)
624 : {
625 0 : if (i == (nLines - 1))
626 0 : aTxt.SetSize(Size(aTxt.GetWidth() / 2, aTxt.GetHeight()));
627 :
628 0 : if (aTxt.IsOver(aFrmRect) && nAnchor != TextContentAnchorType_AS_CHARACTER && !bIgnoreWrap)
629 : {
630 0 : switch(nWrap)
631 : {
632 : case WrapTextMode_NONE:
633 0 : aTxt.Top() = aFrmRect.Bottom() + nTxtLineHeight;
634 0 : aTxt.Bottom() = aTxt.Top() + nTxtLineHeight - 1;
635 0 : break;
636 :
637 : case WrapTextMode_LEFT:
638 0 : aTxt.Right() = aFrmRect.Left();
639 0 : break;
640 :
641 : case WrapTextMode_RIGHT:
642 0 : aTxt.Left() = aFrmRect.Right();
643 0 : break;
644 : }
645 : }
646 0 : if (pOuterFrame->IsInside(aTxt))
647 0 : DrawRect_Impl( aTxt, m_aTxtCol, m_aTransColor );
648 :
649 0 : aTxt.Move(0, nStep);
650 0 : aTxt.Right() = nOldR;
651 0 : aTxt.Left() = nOldL;
652 : }
653 0 : aTxt.Move(0, -nStep);
654 :
655 0 : if (nAnchor != TextContentAnchorType_AT_FRAME && aTxt.Bottom() > aParaPrtArea.Bottom())
656 : {
657 : // Text has been replaced by frame, so adjust parameters height
658 0 : sal_uIntPtr nDiff = aTxt.Bottom() - aParaPrtArea.Bottom();
659 0 : aParaPrtArea.Bottom() += nDiff;
660 0 : aPara.Bottom() += nDiff;
661 :
662 0 : CalcBoundRect_Impl(aRect);
663 :
664 0 : aParaPrtArea.Bottom() -= nDiff;
665 0 : aPara.Bottom() -= nDiff;
666 : }
667 0 : if (nAnchor == TextContentAnchorType_AT_CHARACTER && bIgnoreWrap)
668 0 : DrawText(aAutoCharFrame, rtl::OUString('A'));
669 : }
670 : else
671 : {
672 0 : DrawText(aParaPrtArea, rtl::OUString(DEMOTEXT));
673 0 : DrawRect_Impl(aDrawObj, m_aBlankCol, m_aBlankFrameCol );
674 : }
675 :
676 : // Draw rectangle on which the frame is aligned:
677 0 : DrawRect_Impl(aRect, m_aTransColor, m_aAlignColor);
678 :
679 : // Frame View
680 0 : sal_Bool bDontFill = (nAnchor == TextContentAnchorType_AT_CHARACTER && aFrmRect.IsOver(aAutoCharFrame)) ? sal_True : bTrans;
681 0 : DrawRect_Impl( aFrmRect, bDontFill? m_aTransColor : m_aBgCol, m_aFrameColor );
682 0 : }
683 :
684 0 : void SvxSwFrameExample::SetRelPos(const Point& rP)
685 : {
686 0 : aRelPos = rP;
687 :
688 0 : if (aRelPos.X() > 0)
689 0 : aRelPos.X() = 5;
690 0 : if (aRelPos.X() < 0)
691 0 : aRelPos.X() = -5;
692 :
693 0 : if (aRelPos.Y() > 0)
694 0 : aRelPos.Y() = 5;
695 0 : if (aRelPos.Y() < 0)
696 0 : aRelPos.Y() = -5;
697 0 : }
698 :
699 0 : void SvxSwFrameExample::DrawRect_Impl(const Rectangle &rRect, const Color &rFillColor, const Color &rLineColor)
700 : {
701 0 : SetFillColor(rFillColor);
702 0 : SetLineColor(rLineColor);
703 0 : Window::DrawRect(rRect);
704 0 : }
705 :
706 :
707 :
708 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|