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