xref: /AOO41X/main/svx/source/dialog/swframeexample.cxx (revision f6e50924346d0b8c0b07c91832a97665dd718b0c)
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