| /************************************************************** | 
 |  *  | 
 |  * Licensed to the Apache Software Foundation (ASF) under one | 
 |  * or more contributor license agreements.  See the NOTICE file | 
 |  * distributed with this work for additional information | 
 |  * regarding copyright ownership.  The ASF licenses this file | 
 |  * to you under the Apache License, Version 2.0 (the | 
 |  * "License"); you may not use this file except in compliance | 
 |  * with the License.  You may obtain a copy of the License at | 
 |  *  | 
 |  *   http://www.apache.org/licenses/LICENSE-2.0 | 
 |  *  | 
 |  * Unless required by applicable law or agreed to in writing, | 
 |  * software distributed under the License is distributed on an | 
 |  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | 
 |  * KIND, either express or implied.  See the License for the | 
 |  * specific language governing permissions and limitations | 
 |  * under the License. | 
 |  *  | 
 |  *************************************************************/ | 
 |  | 
 |  | 
 |  | 
 | // MARKER(update_precomp.py): autogen include statement, do not remove | 
 | #include "precompiled_svx.hxx" | 
 |  | 
 |  | 
 | #include <tools/poly.hxx> | 
 | #include <vcl/metric.hxx> | 
 | #include <vcl/svapp.hxx> | 
 | #include <svtools/colorcfg.hxx> | 
 | #include <svx/swframeexample.hxx> | 
 | #include <com/sun/star/text/TextContentAnchorType.hpp> | 
 | #include <com/sun/star/text/HoriOrientation.hpp> | 
 | #include <com/sun/star/text/VertOrientation.hpp> | 
 | #include <com/sun/star/text/RelOrientation.hpp> | 
 | #include <com/sun/star/text/WrapTextMode.hpp> | 
 |  | 
 | using namespace ::com::sun::star::text; | 
 |  | 
 | #define FLYINFLY_BORDER 3 | 
 | #define DEMOTEXT		"Ij" | 
 | #define C2S(cChar) UniString::CreateFromAscii(cChar) | 
 |  | 
 |  | 
 | SvxSwFrameExample::SvxSwFrameExample( Window *pParent, const ResId& rResID ) : | 
 |  | 
 | 	Window(pParent, rResID), | 
 |  | 
 |     nHAlign     (HoriOrientation::CENTER), | 
 |     nHRel       (RelOrientation::FRAME), | 
 |     nVAlign     (VertOrientation::TOP), | 
 |     nVRel       (RelOrientation::PRINT_AREA), | 
 |     nWrap       (WrapTextMode_NONE), | 
 |     nAnchor     (TextContentAnchorType_AT_PAGE), | 
 |     bTrans      (sal_False), | 
 |     aRelPos     (Point(0,0)) | 
 | { | 
 |     InitColors_Impl(); | 
 | 	SetMapMode(MAP_PIXEL); | 
 | } | 
 |  | 
 | SvxSwFrameExample::~SvxSwFrameExample() | 
 | { | 
 | } | 
 |  | 
 | void SvxSwFrameExample::InitColors_Impl( void ) | 
 | { | 
 | 	const StyleSettings& rSettings = GetSettings().GetStyleSettings(); | 
 | 	m_aBgCol = Color( rSettings.GetWindowColor() );								// old: COL_WHITE | 
 |  | 
 | 	sal_Bool bHC = rSettings.GetHighContrastMode(); | 
 |  | 
 | 	m_aFrameColor = Color( COL_LIGHTGREEN ); | 
 | 	m_aAlignColor = Color( COL_LIGHTRED ); | 
 | 	m_aTransColor = Color( COL_TRANSPARENT ); | 
 |  | 
 |     m_aTxtCol = bHC? | 
 |         svtools::ColorConfig().GetColorValue(svtools::FONTCOLOR).nColor : | 
 |         Color( COL_GRAY );      // old: COL_GRAY | 
 | 	m_aPrintAreaCol = bHC? m_aTxtCol : Color( COL_GRAY ); | 
 | 	m_aBorderCol = m_aTxtCol;													// old: COL_BLACK; | 
 | 	m_aBlankCol = bHC? m_aTxtCol : Color( COL_LIGHTGRAY ); | 
 | 	m_aBlankFrameCol = bHC? m_aTxtCol : Color( COL_GRAY ); | 
 | } | 
 |  | 
 | void SvxSwFrameExample::DataChanged( const DataChangedEvent& rDCEvt ) | 
 | { | 
 | 	Window::DataChanged( rDCEvt ); | 
 |  | 
 | 	if( rDCEvt.GetType() == DATACHANGED_SETTINGS && ( rDCEvt.GetFlags() & SETTINGS_STYLE ) ) | 
 |         InitColors_Impl(); | 
 | } | 
 |  | 
 | void SvxSwFrameExample::InitAllRects_Impl() | 
 | { | 
 | //    const Size aSz(GetOutputSizePixel()); | 
 |  | 
 | 	// Seite | 
 | //    aPage.SetSize(Size(aSz.Width() - 3, aSz.Height() - 3)); | 
 |     aPage.SetSize( GetOutputSizePixel() ); | 
 |  | 
 | 	sal_uIntPtr nOutWPix = aPage.GetWidth(); | 
 | 	sal_uIntPtr nOutHPix = aPage.GetHeight(); | 
 |  | 
 | 	// PrintArea | 
 | 	sal_uIntPtr nLBorder; | 
 | 	sal_uIntPtr nRBorder; | 
 | 	sal_uIntPtr nTBorder; | 
 | 	sal_uIntPtr nBBorder; | 
 |  | 
 | 	sal_uIntPtr nLTxtBorder; | 
 | 	sal_uIntPtr nRTxtBorder; | 
 | 	sal_uIntPtr nTTxtBorder; | 
 | 	sal_uIntPtr nBTxtBorder; | 
 |  | 
 |     if (nAnchor != TextContentAnchorType_AS_CHARACTER) | 
 | 	{ | 
 | 		nLBorder = 14; | 
 | 		nRBorder = 10; | 
 | 		nTBorder = 10; | 
 | 		nBBorder = 15; | 
 |  | 
 | 		nLTxtBorder = 8; | 
 | 		nRTxtBorder = 4; | 
 | 		nTTxtBorder = 2; | 
 | 		nBTxtBorder = 2; | 
 | 	} | 
 | 	else | 
 | 	{ | 
 | 		nLBorder = 2; | 
 | 		nRBorder = 2; | 
 | 		nTBorder = 2; | 
 | 		nBBorder = 2; | 
 |  | 
 | 		nLTxtBorder = 2; | 
 | 		nRTxtBorder = 2; | 
 | 		nTTxtBorder = 2; | 
 | 		nBTxtBorder = 2; | 
 | 	} | 
 | 	aPagePrtArea = Rectangle(Point(nLBorder, nTBorder), Point((nOutWPix - 1) - nRBorder, (nOutHPix - 1) - nBBorder)); | 
 |  | 
 | 	// Beispiel-Text: Vorbereiten fuer die Textausgabe | 
 | 	// Eine Textzeile | 
 | 	aTextLine = aPagePrtArea; | 
 | 	aTextLine.SetSize(Size(aTextLine.GetWidth(), 2)); | 
 | 	aTextLine.Left()	+= nLTxtBorder; | 
 | 	aTextLine.Right()	-= nRTxtBorder; | 
 | 	aTextLine.Move(0, nTTxtBorder); | 
 |  | 
 | 	// Rechteck um Absatz incl. Raender | 
 | 	sal_uInt16 nLines = (sal_uInt16)((aPagePrtArea.GetHeight() / 2 - nTTxtBorder - nBTxtBorder) | 
 | 			 / (aTextLine.GetHeight() + 2)); | 
 | 	aPara = aPagePrtArea; | 
 | 	aPara.SetSize(Size(aPara.GetWidth(), | 
 | 		(aTextLine.GetHeight() + 2) * nLines + nTTxtBorder + nBTxtBorder)); | 
 |  | 
 | 	// Rechteck um Absatz ohne Raender | 
 | 	aParaPrtArea = aPara; | 
 | 	aParaPrtArea.Left()		+= nLTxtBorder; | 
 | 	aParaPrtArea.Right()	-= nRTxtBorder; | 
 | 	aParaPrtArea.Top()		+= nTTxtBorder; | 
 | 	aParaPrtArea.Bottom()	-= nBTxtBorder; | 
 |  | 
 |     if (nAnchor == TextContentAnchorType_AS_CHARACTER || nAnchor == TextContentAnchorType_AT_CHARACTER) | 
 | 	{ | 
 |         Font aFont = OutputDevice::GetDefaultFont( | 
 |                                 DEFAULTFONT_LATIN_TEXT, Application::GetSettings().GetLanguage(), | 
 | 								DEFAULTFONT_FLAGS_ONLYONE, this ); | 
 | 		aFont.SetColor( m_aTxtCol ); | 
 | 		aFont.SetFillColor( m_aBgCol ); | 
 | 		aFont.SetWeight(WEIGHT_NORMAL); | 
 |  | 
 |         if (nAnchor == TextContentAnchorType_AS_CHARACTER) | 
 | 		{ | 
 | 			aFont.SetSize(Size(0, aParaPrtArea.GetHeight() - 2)); | 
 | 			SetFont(aFont); | 
 | 			aParaPrtArea.SetSize(Size(GetTextWidth(C2S(DEMOTEXT)), GetTextHeight())); | 
 | 		} | 
 | 		else | 
 | 		{ | 
 | 			aFont.SetSize(Size(0, aParaPrtArea.GetHeight() / 2)); | 
 | 			SetFont(aFont); | 
 | 			aAutoCharFrame.SetSize(Size(GetTextWidth('A'), GetTextHeight())); | 
 | 			aAutoCharFrame.SetPos(Point(aParaPrtArea.Left() + (aParaPrtArea.GetWidth() - aAutoCharFrame.GetWidth()) / 2, | 
 | 				aParaPrtArea.Top() + (aParaPrtArea.GetHeight() - aAutoCharFrame.GetHeight()) / 2)); | 
 | 		} | 
 | 	} | 
 |  | 
 | 	// Innerer Frame fuer am Frame verankerte Rahmen | 
 | 	aFrameAtFrame = aPara; | 
 | 	aFrameAtFrame.Left() += 9; | 
 | 	aFrameAtFrame.Right() -= 5; | 
 | 	aFrameAtFrame.Bottom() += 5; | 
 | 	aFrameAtFrame.SetPos(Point(aFrameAtFrame.Left() + 2, (aPagePrtArea.Bottom() - aFrameAtFrame.GetHeight()) / 2 + 5)); | 
 |  | 
 | 	// Groesse des zu positionierenden Rahmens | 
 |     if (nAnchor != TextContentAnchorType_AS_CHARACTER) | 
 | 	{ | 
 |         sal_uIntPtr nLFBorder = nAnchor == TextContentAnchorType_AT_PAGE ? nLBorder : nLTxtBorder; | 
 |         sal_uIntPtr nRFBorder = nAnchor == TextContentAnchorType_AT_PAGE ? nRBorder : nRTxtBorder; | 
 |  | 
 | 		switch (nHRel) | 
 | 		{ | 
 |             case RelOrientation::PAGE_LEFT: | 
 |             case RelOrientation::FRAME_LEFT: | 
 | 				aFrmSize = Size(nLFBorder - 4, (aTextLine.GetHeight() + 2) * 3); | 
 | 				break; | 
 |  | 
 |             case RelOrientation::PAGE_RIGHT: | 
 |             case RelOrientation::FRAME_RIGHT: | 
 | 				aFrmSize = Size(nRFBorder - 4, (aTextLine.GetHeight() + 2) * 3); | 
 | 				break; | 
 |  | 
 | 			default: | 
 | 				aFrmSize = Size(nLBorder - 3, (aTextLine.GetHeight() + 2) * 3); | 
 | 				break; | 
 | 		} | 
 | 		aFrmSize.Width() = Max(5L, aFrmSize.Width()); | 
 | 		aFrmSize.Height() = Max(5L, aFrmSize.Height()); | 
 | 	} | 
 | 	else | 
 | 	{ | 
 | 		sal_uIntPtr nFreeWidth = aPagePrtArea.GetWidth() - GetTextWidth(C2S(DEMOTEXT)); | 
 |  | 
 | 		aFrmSize = Size(nFreeWidth / 2, (aTextLine.GetHeight() + 2) * 3); | 
 | 		aDrawObj.SetSize(Size(Max(5L, (long)nFreeWidth / 3L), Max(5L, aFrmSize.Height() * 3L))); | 
 | 		aDrawObj.SetPos(Point(aParaPrtArea.Right() + 1, aParaPrtArea.Bottom() / 2)); | 
 | 		aParaPrtArea.Right() = aDrawObj.Right(); | 
 | 	} | 
 | } | 
 |  | 
 | void SvxSwFrameExample::CalcBoundRect_Impl(Rectangle &rRect) | 
 | { | 
 | 	switch (nAnchor) | 
 | 	{ | 
 |         case TextContentAnchorType_AT_PAGE: | 
 | 		{ | 
 | 			switch (nHRel) | 
 | 			{ | 
 |                 case RelOrientation::FRAME: | 
 |                 case RelOrientation::PAGE_FRAME: | 
 | 					rRect.Left() = aPage.Left(); | 
 | 					rRect.Right() = aPage.Right(); | 
 | 					break; | 
 |  | 
 |                 case RelOrientation::PRINT_AREA: | 
 |                 case RelOrientation::PAGE_PRINT_AREA: | 
 | 					rRect.Left() = aPagePrtArea.Left(); | 
 | 					rRect.Right() = aPagePrtArea.Right(); | 
 | 					break; | 
 |  | 
 |                 case RelOrientation::PAGE_LEFT: | 
 | 					rRect.Left() = aPage.Left(); | 
 | 					rRect.Right() = aPagePrtArea.Left(); | 
 | 					break; | 
 |  | 
 |                 case RelOrientation::PAGE_RIGHT: | 
 | 					rRect.Left() = aPagePrtArea.Right(); | 
 | 					rRect.Right() = aPage.Right(); | 
 | 					break; | 
 | 			} | 
 |  | 
 | 			switch (nVRel) | 
 | 			{ | 
 |                 case RelOrientation::PRINT_AREA: | 
 |                 case RelOrientation::PAGE_PRINT_AREA: | 
 | 					rRect.Top() = aPagePrtArea.Top(); | 
 | 					rRect.Bottom() = aPagePrtArea.Bottom(); | 
 | 					break; | 
 |  | 
 |                 case RelOrientation::FRAME: | 
 |                 case RelOrientation::PAGE_FRAME: | 
 | 					rRect.Top() = aPage.Top(); | 
 | 					rRect.Bottom() = aPage.Bottom(); | 
 | 					break; | 
 | 			} | 
 | 		} | 
 | 		break; | 
 |  | 
 |         case TextContentAnchorType_AT_FRAME: | 
 | 		{ | 
 | 			switch (nHRel) | 
 | 			{ | 
 |                 case RelOrientation::FRAME: | 
 |                 case RelOrientation::PAGE_FRAME: | 
 | 					rRect.Left() = aFrameAtFrame.Left(); | 
 | 					rRect.Right() = aFrameAtFrame.Right(); | 
 | 					break; | 
 |  | 
 |                 case RelOrientation::PRINT_AREA: | 
 |                 case RelOrientation::PAGE_PRINT_AREA: | 
 |                     rRect.Left() = aFrameAtFrame.Left() + FLYINFLY_BORDER; | 
 | 					rRect.Right() = aFrameAtFrame.Right() - FLYINFLY_BORDER; | 
 | 					break; | 
 |  | 
 |                 case RelOrientation::PAGE_RIGHT: | 
 |                     rRect.Left() = aFrameAtFrame.Left(); | 
 | 					rRect.Right() = aFrameAtFrame.Left() + FLYINFLY_BORDER; | 
 | 					break; | 
 |  | 
 |                 case RelOrientation::PAGE_LEFT: | 
 |                     rRect.Left() = aFrameAtFrame.Right(); | 
 | 					rRect.Right() = aFrameAtFrame.Right() - FLYINFLY_BORDER; | 
 | 					break; | 
 | 			} | 
 |  | 
 | 			switch (nVRel) | 
 | 			{ | 
 |                 case RelOrientation::FRAME: | 
 |                 case RelOrientation::PAGE_FRAME: | 
 |                     rRect.Top() = aFrameAtFrame.Top(); | 
 | 					rRect.Bottom() = aFrameAtFrame.Bottom(); | 
 | 					break; | 
 |  | 
 |                 case RelOrientation::PRINT_AREA: | 
 |                 case RelOrientation::PAGE_PRINT_AREA: | 
 |                     rRect.Top() = aFrameAtFrame.Top() + FLYINFLY_BORDER; | 
 | 					rRect.Bottom() = aFrameAtFrame.Bottom() - FLYINFLY_BORDER; | 
 | 					break; | 
 | 			} | 
 | 		} | 
 | 		break; | 
 |         case TextContentAnchorType_AT_PARAGRAPH: | 
 |         case TextContentAnchorType_AT_CHARACTER: | 
 | 		{ | 
 | 			switch (nHRel) | 
 | 			{ | 
 |                 case RelOrientation::FRAME: | 
 | 					rRect.Left() = aPara.Left(); | 
 | 					rRect.Right() = aPara.Right(); | 
 | 					break; | 
 |  | 
 |                 case RelOrientation::PRINT_AREA: | 
 | 					rRect.Left() = aParaPrtArea.Left(); | 
 | 					rRect.Right() = aParaPrtArea.Right(); | 
 | 					break; | 
 |  | 
 |                 case RelOrientation::PAGE_LEFT: | 
 | 					rRect.Left() = aPage.Left(); | 
 | 					rRect.Right() = aPagePrtArea.Left(); | 
 | 					break; | 
 |  | 
 |                 case RelOrientation::PAGE_RIGHT: | 
 | 					rRect.Left() = aPagePrtArea.Right(); | 
 | 					rRect.Right() = aPage.Right(); | 
 | 					break; | 
 |  | 
 |                 case RelOrientation::PAGE_FRAME: | 
 | 					rRect.Left() = aPage.Left(); | 
 | 					rRect.Right() = aPage.Right(); | 
 | 					break; | 
 |  | 
 |                 case RelOrientation::PAGE_PRINT_AREA: | 
 | 					rRect.Left() = aPagePrtArea.Left(); | 
 | 					rRect.Right() = aPagePrtArea.Right(); | 
 | 					break; | 
 |  | 
 |                 case RelOrientation::FRAME_LEFT: | 
 | 					rRect.Left() = aPara.Left(); | 
 | 					rRect.Right() = aParaPrtArea.Left(); | 
 | 					break; | 
 |  | 
 |                 case RelOrientation::FRAME_RIGHT: | 
 | 					rRect.Left() = aParaPrtArea.Right(); | 
 | 					rRect.Right() = aPara.Right(); | 
 | 					break; | 
 |  | 
 |                 case RelOrientation::CHAR: | 
 | 					rRect.Left() = aAutoCharFrame.Left(); | 
 | 					rRect.Right() = aAutoCharFrame.Left(); | 
 | 					break; | 
 | 			} | 
 |  | 
 | 			switch (nVRel) | 
 | 			{ | 
 |                 case RelOrientation::FRAME: | 
 | 					rRect.Top() = aPara.Top(); | 
 | 					rRect.Bottom() = aPara.Bottom(); | 
 | 					break; | 
 |  | 
 |                 case RelOrientation::PRINT_AREA: | 
 | 					rRect.Top() = aParaPrtArea.Top(); | 
 | 					rRect.Bottom() = aParaPrtArea.Bottom(); | 
 | 					break; | 
 |  | 
 |                 case RelOrientation::CHAR: | 
 |                     if (nVAlign != VertOrientation::NONE && | 
 |                                 nVAlign != VertOrientation::CHAR_BOTTOM) | 
 | 						rRect.Top() = aAutoCharFrame.Top(); | 
 | 					else | 
 | 						rRect.Top() = aAutoCharFrame.Bottom(); | 
 | 					rRect.Bottom() = aAutoCharFrame.Bottom(); | 
 | 					break; | 
 |                 // OD 12.11.2003 #i22341# | 
 |                 case RelOrientation::TEXT_LINE: | 
 |                     rRect.Top() = aAutoCharFrame.Top(); | 
 |                     rRect.Bottom() = aAutoCharFrame.Top(); | 
 |                 break; | 
 | 			} | 
 | 		} | 
 | 		break; | 
 |  | 
 |         case TextContentAnchorType_AS_CHARACTER: | 
 | 			rRect.Left() = aParaPrtArea.Left(); | 
 | 			rRect.Right() = aParaPrtArea.Right(); | 
 |  | 
 | 			switch (nVAlign) | 
 | 			{ | 
 |                 case VertOrientation::NONE: | 
 |                 case VertOrientation::TOP: | 
 |                 case VertOrientation::CENTER: | 
 |                 case VertOrientation::BOTTOM: | 
 | 				{ | 
 | 					FontMetric aMetric(GetFontMetric()); | 
 |  | 
 | 					rRect.Top() = aParaPrtArea.Bottom() - aMetric.GetDescent(); | 
 | 					rRect.Bottom() = rRect.Top(); | 
 | 				} | 
 | 				break; | 
 |  | 
 | 				default: | 
 |  | 
 |                 case VertOrientation::LINE_TOP: | 
 |                 case VertOrientation::LINE_CENTER: | 
 |                 case VertOrientation::LINE_BOTTOM: | 
 | 					rRect.Top() = aParaPrtArea.Top(); | 
 | 					rRect.Bottom() = aDrawObj.Bottom(); | 
 | 					break; | 
 |  | 
 |                 case VertOrientation::CHAR_TOP: | 
 |                 case VertOrientation::CHAR_CENTER: | 
 |                 case VertOrientation::CHAR_BOTTOM: | 
 | 					rRect.Top() = aParaPrtArea.Top(); | 
 | 					rRect.Bottom() = aParaPrtArea.Bottom(); | 
 | 					break; | 
 | 			} | 
 | 			break; | 
 |  | 
 | 		default: | 
 | 			break; | 
 | 	} | 
 | } | 
 |  | 
 | Rectangle SvxSwFrameExample::DrawInnerFrame_Impl(const Rectangle &rRect, const Color &rFillColor, const Color &rBorderColor) | 
 | { | 
 |     DrawRect_Impl(rRect, rFillColor, rBorderColor); | 
 |  | 
 | 	// Bereich, zu dem relativ positioniert wird, bestimmen | 
 | 	Rectangle aRect(rRect);	// aPagePrtArea = Default | 
 |     CalcBoundRect_Impl(aRect); | 
 |  | 
 |     if (nAnchor == TextContentAnchorType_AT_FRAME && &rRect == &aPagePrtArea) | 
 | 	{ | 
 | 		// Testabsatz zeichnen | 
 | 		Rectangle aTxt(aTextLine); | 
 |         sal_Int32 nStep = aTxt.GetHeight() + 2; | 
 | 		sal_uInt16 nLines = (sal_uInt16)(aParaPrtArea.GetHeight() / (aTextLine.GetHeight() + 2)); | 
 |  | 
 | 		for (sal_uInt16 i = 0; i < nLines; i++) | 
 | 		{ | 
 | 			if (i == nLines - 1) | 
 | 				aTxt.SetSize(Size(aTxt.GetWidth() / 2, aTxt.GetHeight())); | 
 |             DrawRect_Impl(aTxt, m_aTxtCol, m_aTransColor); | 
 | 			aTxt.Move(0, nStep); | 
 | 		} | 
 | 	} | 
 |  | 
 | 	return aRect; | 
 | } | 
 |  | 
 | void SvxSwFrameExample::Paint(const Rectangle&) | 
 | { | 
 |     InitAllRects_Impl(); | 
 |  | 
 | 	// Schatten zeichnen | 
 | //    Rectangle aShadow(aPage); | 
 | //    aShadow += Point(3, 3); | 
 | //    DrawRect_Impl(aShadow, Color(COL_GRAY), aTransColor); | 
 |  | 
 | 	// Seite zeichnen | 
 |     DrawRect_Impl( aPage, m_aBgCol, m_aBorderCol ); | 
 |  | 
 | 	// PrintArea zeichnen | 
 |     Rectangle aRect = DrawInnerFrame_Impl( aPagePrtArea, m_aTransColor, m_aPrintAreaCol ); | 
 |  | 
 |     if (nAnchor == TextContentAnchorType_AT_FRAME) | 
 |         aRect = DrawInnerFrame_Impl( aFrameAtFrame, m_aBgCol, m_aBorderCol ); | 
 |  | 
 | 	long lXPos 	  = 0; | 
 | 	long lYPos 	  = 0; | 
 |  | 
 | 	// Horizontale Ausrichtung | 
 | 	// | 
 |     if (nAnchor != TextContentAnchorType_AS_CHARACTER) | 
 | 	{ | 
 | 		switch (nHAlign) | 
 | 		{ | 
 |             case HoriOrientation::RIGHT: | 
 | 			{ | 
 | 				lXPos = aRect.Right() - aFrmSize.Width() + 1; | 
 | 				break; | 
 | 			} | 
 |             case HoriOrientation::CENTER: | 
 | 			{ | 
 | 				lXPos = aRect.Left() + (aRect.GetWidth() - aFrmSize.Width()) / 2; | 
 | 				break; | 
 | 			} | 
 |             case HoriOrientation::NONE: | 
 | 			{ | 
 | 				lXPos = aRect.Left() + aRelPos.X(); | 
 | 				break; | 
 | 			} | 
 |  | 
 |             default: // HoriOrientation::LEFT | 
 | 				lXPos = aRect.Left(); | 
 | 				break; | 
 | 		} | 
 | 	} | 
 | 	else | 
 |        lXPos = aRect.Right() + 2; | 
 |  | 
 | 	// Vertikale Ausrichtung | 
 | 	// | 
 |     if (nAnchor != TextContentAnchorType_AS_CHARACTER) | 
 | 	{ | 
 | 		switch (nVAlign) | 
 | 		{ | 
 |             case VertOrientation::BOTTOM: | 
 |             case VertOrientation::LINE_BOTTOM: | 
 | 			{ | 
 |                 // OD 12.11.2003 #i22341# | 
 |                 if ( nVRel != RelOrientation::TEXT_LINE ) | 
 |                 { | 
 |                     lYPos = aRect.Bottom() - aFrmSize.Height() + 1; | 
 |                 } | 
 |                 else | 
 |                 { | 
 |                     lYPos = aRect.Top(); | 
 |                 } | 
 | 				break; | 
 | 			} | 
 |             case VertOrientation::CENTER: | 
 |             case VertOrientation::LINE_CENTER: | 
 | 			{ | 
 | 				lYPos = aRect.Top() + (aRect.GetHeight() - aFrmSize.Height()) / 2; | 
 | 				break; | 
 | 			} | 
 |             case VertOrientation::NONE: | 
 | 			{ | 
 |                 // OD 12.11.2003 #i22341# | 
 |                 if ( nVRel != RelOrientation::CHAR && nVRel != RelOrientation::TEXT_LINE ) | 
 | 					lYPos = aRect.Top() + aRelPos.Y(); | 
 | 				else | 
 | 					lYPos = aRect.Top() - aRelPos.Y(); | 
 | 				break; | 
 | 			} | 
 | 			default: | 
 |                 // OD 12.11.2003 #i22341# | 
 |                 if ( nVRel != RelOrientation::TEXT_LINE ) | 
 |                 { | 
 |                     lYPos = aRect.Top(); | 
 |                 } | 
 |                 else | 
 |                 { | 
 |                     lYPos = aRect.Bottom() - aFrmSize.Height() + 1; | 
 |                 } | 
 | 				break; | 
 | 		} | 
 | 	} | 
 | 	else | 
 | 	{ | 
 | 		switch(nVAlign) | 
 | 		{ | 
 |             case VertOrientation::CENTER: | 
 |             case VertOrientation::CHAR_CENTER: | 
 |             case VertOrientation::LINE_CENTER: | 
 | 				lYPos = aRect.Top() + (aRect.GetHeight() - aFrmSize.Height()) / 2; | 
 | 				break; | 
 |  | 
 |             case VertOrientation::TOP: | 
 |             case VertOrientation::CHAR_BOTTOM: | 
 |             case VertOrientation::LINE_BOTTOM: | 
 | 				lYPos = aRect.Bottom() - aFrmSize.Height() + 1; | 
 | 				break; | 
 |  | 
 | /*          case VertOrientation::NONE: | 
 |             case VertOrientation::BOTTOM: | 
 |             case VertOrientation::CHAR_TOP: | 
 |             case VertOrientation::LINE_TOP:*/ | 
 | 			default: | 
 | 				lYPos = aRect.Top() - aRelPos.Y(); | 
 | 				break; | 
 | 		} | 
 | 	} | 
 |  | 
 | 	Rectangle aFrmRect(Point(lXPos, lYPos), aFrmSize); | 
 |  | 
 | 	Rectangle *pOuterFrame = &aPage; | 
 |  | 
 |     if (nAnchor == TextContentAnchorType_AT_FRAME) | 
 | 		pOuterFrame = &aFrameAtFrame; | 
 |  | 
 | 	if (aFrmRect.Left() < pOuterFrame->Left()) | 
 | 		aFrmRect.Move(pOuterFrame->Left() - aFrmRect.Left(), 0); | 
 | 	if (aFrmRect.Right() > pOuterFrame->Right()) | 
 | 		aFrmRect.Move(pOuterFrame->Right() - aFrmRect.Right(), 0); | 
 |  | 
 | 	if (aFrmRect.Top() < pOuterFrame->Top()) | 
 | 		aFrmRect.Move(0, pOuterFrame->Top() - aFrmRect.Top()); | 
 | 	if (aFrmRect.Bottom() > pOuterFrame->Bottom()) | 
 | 		aFrmRect.Move(0, pOuterFrame->Bottom() - aFrmRect.Bottom()); | 
 |  | 
 | 	// Testabsatz zeichnen | 
 | 	const long nTxtLineHeight = aTextLine.GetHeight(); | 
 | 	Rectangle aTxt(aTextLine); | 
 |     sal_Int32 nStep; | 
 |     sal_uInt16 nLines; | 
 |  | 
 |     if (nAnchor == TextContentAnchorType_AT_FRAME) | 
 | 	{ | 
 | 		aTxt.Left() = aFrameAtFrame.Left() + FLYINFLY_BORDER; | 
 | 		aTxt.Right() = aFrameAtFrame.Right() - FLYINFLY_BORDER; | 
 | 		aTxt.Top() = aFrameAtFrame.Top() + FLYINFLY_BORDER; | 
 | 		aTxt.Bottom() = aTxt.Top() + aTextLine.GetHeight() - 1; | 
 |  | 
 | 		nStep = aTxt.GetHeight() + 2; | 
 | 		nLines = (sal_uInt16)(((aFrameAtFrame.GetHeight() - 2 * FLYINFLY_BORDER) * 2 / 3) | 
 | 				 / (aTxt.GetHeight() + 2)); | 
 | 	} | 
 | 	else | 
 | 	{ | 
 | 		nStep = aTxt.GetHeight() + 2; | 
 | 		nLines = (sal_uInt16)(aParaPrtArea.GetHeight() / (aTextLine.GetHeight() + 2)); | 
 | 	} | 
 |  | 
 |     if (nAnchor != TextContentAnchorType_AS_CHARACTER) | 
 | 	{ | 
 | 		// Text simulieren | 
 | 		// | 
 | 		const long nOldR = aTxt.Right(); | 
 | 		const long nOldL = aTxt.Left(); | 
 |  | 
 |         // OD 12.11.2003 #i22341# | 
 |         const bool bIgnoreWrap = nAnchor == TextContentAnchorType_AT_CHARACTER && | 
 |                            ( nHRel == RelOrientation::CHAR || nVRel == RelOrientation::CHAR || | 
 |                              nVRel == RelOrientation::TEXT_LINE ); | 
 |  | 
 | 		for (sal_uInt16 i = 0; i < nLines; ++i) | 
 | 		{ | 
 | 			if (i == (nLines - 1)) | 
 | 				aTxt.SetSize(Size(aTxt.GetWidth() / 2, aTxt.GetHeight())); | 
 |  | 
 |             if (aTxt.IsOver(aFrmRect) && nAnchor != TextContentAnchorType_AS_CHARACTER && !bIgnoreWrap) | 
 | 			{ | 
 | 				switch(nWrap) | 
 | 				{ | 
 |                     case WrapTextMode_NONE: | 
 | 						aTxt.Top() 	  = aFrmRect.Bottom() + nTxtLineHeight; | 
 | 						aTxt.Bottom() = aTxt.Top() + nTxtLineHeight - 1; | 
 | 						break; | 
 |  | 
 |                     case WrapTextMode_LEFT: | 
 | 						aTxt.Right() = aFrmRect.Left(); | 
 | 						break; | 
 |  | 
 |                     case WrapTextMode_RIGHT: | 
 | 						aTxt.Left() = aFrmRect.Right(); | 
 | 						break; | 
 | 				} | 
 | 			} | 
 | 			if (pOuterFrame->IsInside(aTxt)) | 
 |                 DrawRect_Impl( aTxt, m_aTxtCol, m_aTransColor ); | 
 |  | 
 | 			aTxt.Move(0, nStep); | 
 | 			aTxt.Right() = nOldR; | 
 | 			aTxt.Left()  = nOldL; | 
 | 		} | 
 | 		aTxt.Move(0, -nStep); | 
 |  | 
 |         if (nAnchor != TextContentAnchorType_AT_FRAME && aTxt.Bottom() > aParaPrtArea.Bottom()) | 
 | 		{ | 
 | 			// Text wurde durch Rahmen verdraengt, daher Para-Hoehe anpassen | 
 | 			sal_uIntPtr nDiff = aTxt.Bottom() - aParaPrtArea.Bottom(); | 
 | 			aParaPrtArea.Bottom() += nDiff; | 
 | 			aPara.Bottom() += nDiff; | 
 |  | 
 |             CalcBoundRect_Impl(aRect); | 
 |  | 
 | 			aParaPrtArea.Bottom() -= nDiff; | 
 | 			aPara.Bottom() -= nDiff; | 
 | 		} | 
 |         if (nAnchor == TextContentAnchorType_AT_CHARACTER && bIgnoreWrap) | 
 | 			DrawText(aAutoCharFrame, 'A'); | 
 | 	} | 
 | 	else | 
 | 	{ | 
 | 		DrawText(aParaPrtArea, C2S(DEMOTEXT)); | 
 |         DrawRect_Impl(aDrawObj, m_aBlankCol, m_aBlankFrameCol ); | 
 | 	} | 
 |  | 
 | 	// Rechteck zeichnen, zu dem der Rahmen ausgerichtet wird: | 
 |     DrawRect_Impl(aRect, m_aTransColor, m_aAlignColor); | 
 |  | 
 | 	// Frame anzeigen | 
 |     sal_Bool bDontFill = (nAnchor == TextContentAnchorType_AT_CHARACTER && aFrmRect.IsOver(aAutoCharFrame)) ? sal_True : bTrans; | 
 |     DrawRect_Impl( aFrmRect, bDontFill? m_aTransColor : m_aBgCol, m_aFrameColor ); | 
 | } | 
 |  | 
 | void SvxSwFrameExample::SetRelPos(const Point& rP) | 
 | { | 
 | 	aRelPos = rP; | 
 |  | 
 | 	if (aRelPos.X() > 0) | 
 | 		aRelPos.X() = 5; | 
 | 	if (aRelPos.X() < 0) | 
 | 		aRelPos.X() = -5; | 
 |  | 
 | 	if (aRelPos.Y() > 0) | 
 | 		aRelPos.Y() = 5; | 
 | 	if (aRelPos.Y() < 0) | 
 | 		aRelPos.Y() = -5; | 
 | } | 
 |  | 
 | void SvxSwFrameExample::DrawRect_Impl(const Rectangle &rRect, const Color &rFillColor, const Color &rLineColor) | 
 | { | 
 | 	SetFillColor(rFillColor); | 
 | 	SetLineColor(rLineColor); | 
 | 	Window::DrawRect(rRect); | 
 | } | 
 |  | 
 |  | 
 |  |