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