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