Kaydet (Commit) 56c6be00 authored tarafından Andreas Martens's avatar Andreas Martens

New: Rotated text with frame as character inside

üst 67f4f128
......@@ -2,9 +2,9 @@
*
* $RCSfile: flyfrms.hxx,v $
*
* $Revision: 1.1.1.1 $
* $Revision: 1.2 $
*
* last change: $Author: hr $ $Date: 2000-09-19 00:08:20 $
* last change: $Author: ama $ $Date: 2001-02-01 13:56:32 $
*
* The Contents of this file are made available subject to the terms of
* either of the following licenses
......@@ -162,7 +162,8 @@ public:
virtual void Format( const SwBorderAttrs *pAttrs = 0 );
virtual void Modify( SfxPoolItem*, SfxPoolItem* );
void SetRefPoint( const Point& rPoint, const Point &rRelPos );
void SetRefPoint( const Point& rPoint, const Point &rRelAttr,
const Point &rRelPos );
const Point &GetRefPoint() const { return aRef; }
const Point &GetRelPos() const;
long GetLineHeight() const { return nLine; }
......
......@@ -2,9 +2,9 @@
*
* $RCSfile: flyincnt.cxx,v $
*
* $Revision: 1.1.1.1 $
* $Revision: 1.2 $
*
* last change: $Author: hr $ $Date: 2000-09-19 00:08:22 $
* last change: $Author: ama $ $Date: 2001-02-01 13:57:58 $
*
* The Contents of this file are made available subject to the terms of
* either of the following licenses
......@@ -123,12 +123,13 @@ SwFlyInCntFrm::~SwFlyInCntFrm()
|* Letzte Aenderung MA 06. Aug. 95
|*
|*************************************************************************/
void SwFlyInCntFrm::SetRefPoint( const Point& rPoint, const Point& rRelPos )
void SwFlyInCntFrm::SetRefPoint( const Point& rPoint, const Point& rRelAttr,
const Point& rRelPos )
{
ASSERT( rPoint != aRef || rRelPos != aRelPos, "SetRefPoint: no change" );
ASSERT( rPoint != aRef || rRelAttr != aRelPos, "SetRefPoint: no change" );
const SwFlyNotify aNotify( this );
aRef = rPoint;
aRelPos = rRelPos;
aRelPos = rRelAttr;
Frm().Pos( rPoint + rRelPos );
/*
//Kein InvalidatePos hier, denn das wuerde dem Cntnt ein Prepare
......
......@@ -2,9 +2,9 @@
*
* $RCSfile: itrform2.cxx,v $
*
* $Revision: 1.15 $
* $Revision: 1.16 $
*
* last change: $Author: ama $ $Date: 2000-12-21 09:10:30 $
* last change: $Author: ama $ $Date: 2001-02-01 14:01:34 $
*
* The Contents of this file are made available subject to the terms of
* either of the following licenses
......@@ -769,7 +769,8 @@ void SwTxtFormatter::BuildPortions( SwTxtFormatInfo &rInf )
&& ( rInf.X() + GetLeftMargin() >= rInf.GetPaintOfst() ) )
rInf.SetPaintOfst( 0 );
if ( pPor->IsFlyCntPortion() )
if( pPor->IsFlyCntPortion() || ( pPor->IsMultiPortion() &&
((SwMultiPortion*)pPor)->HasFlyInCntnt() ) )
SetFlyInCntBase();
rInf.SetFull( bFull );
......@@ -834,7 +835,7 @@ void SwTxtFormatter::CalcAdjustLine( SwLineLayout *pCurr )
CalcAdjLine( pCurr );
// 23348: z.B. bei zentrierten Flys muessen wir den RefPoint
// auf jeden Fall umsetzen, deshalb bAllWays = sal_True
UpdatePos( pCurr, sal_True );
UpdatePos( pCurr, GetTopLeft(), GetStart(), sal_True );
}
}
}
......@@ -1233,10 +1234,20 @@ SwLinePortion *SwTxtFormatter::NewPortion( SwTxtFormatInfo &rInf )
{
SwMultiPortion* pTmp = NULL;
if( RES_TXTATR_CJK_RUBY == pTwoLines->Which() )
pTmp = new SwRubyPortion( *pTwoLines,*rInf.GetFont(),nEnd );
pTmp = new SwRubyPortion( *pTwoLines,*rInf.GetFont(),nEnd );
else
#ifdef ROTATION_TEST
pTmp = new SwRotatedPortion( nEnd );
{
static sal_uInt8 nTst = 1;
switch ( nTst )
{
case 1 :
case 3 : pTmp = new SwRotatedPortion( nEnd, nTst );
break;
default:
pTmp = new SwDoubleLinePortion( *pTwoLines, nEnd );
}
}
#else
pTmp = new SwDoubleLinePortion( *pTwoLines, nEnd );
#endif
......@@ -1447,7 +1458,7 @@ xub_StrLen SwTxtFormatter::FormatLine( const xub_StrLen nStart )
}
if ( IsFlyInCntBase() && !IsQuick() )
UpdatePos( pCurr );
UpdatePos( pCurr, GetTopLeft(), GetStart() );
return nNewStart;
}
......
......@@ -2,9 +2,9 @@
*
* $RCSfile: itrform2.hxx,v $
*
* $Revision: 1.4 $
* $Revision: 1.5 $
*
* last change: $Author: ama $ $Date: 2000-11-09 13:37:53 $
* last change: $Author: ama $ $Date: 2001-02-01 14:00:12 $
*
* The Contents of this file are made available subject to the terms of
* either of the following licenses
......@@ -136,7 +136,8 @@ class SwTxtFormatter : public SwTxtPainter
{ return GetInfo().GetIdx() < GetInfo().GetReformatStart(); }
// durch das Adjustment aendert sich die Position der Portions
void UpdatePos( SwLineLayout *pCurr, sal_Bool bAllWays = sal_False ) const;
void UpdatePos( SwLineLayout *pCurr, Point aStart, xub_StrLen nStartIdx,
sal_Bool bAllWays = sal_False ) const;
// Setze alle FlyInCntFrms auf die uebergebene BaseLine
void AlignFlyInCntBase( long nBaseLine ) const;
......
......@@ -2,9 +2,9 @@
*
* $RCSfile: porlay.cxx,v $
*
* $Revision: 1.3 $
* $Revision: 1.4 $
*
* last change: $Author: ama $ $Date: 2000-12-21 09:04:35 $
* last change: $Author: ama $ $Date: 2001-02-01 14:02:55 $
*
* The Contents of this file are made available subject to the terms of
* either of the following licenses
......@@ -78,6 +78,9 @@
#ifndef _PORRST_HXX
#include <porrst.hxx> // SwHangingPortion
#endif
#ifndef _PORMULTI_HXX
#include <pormulti.hxx> // SwMultiPortion
#endif
/*************************************************************************
......@@ -342,7 +345,8 @@ void SwLineLayout::CalcLine( SwTxtFormatter &rLine, SwTxtFormatInfo &rInf )
{
if( Height() < nPosHeight )
Height( nPosHeight );
if( pPos->IsFlyCntPortion() )
if( pPos->IsFlyCntPortion() || ( pPos->IsMultiPortion()
&& ((SwMultiPortion*)pPos)->HasFlyInCntnt() ) )
rLine.SetFlyInCntBase();
if( pPos->IsFlyCntPortion() &&
((SwFlyCntPortion*)pPos)->GetAlign() )
......
......@@ -2,9 +2,9 @@
*
* $RCSfile: possiz.hxx,v $
*
* $Revision: 1.1.1.1 $
* $Revision: 1.2 $
*
* last change: $Author: hr $ $Date: 2000-09-19 00:08:26 $
* last change: $Author: ama $ $Date: 2001-02-01 13:59:07 $
*
* The Contents of this file are made available subject to the terms of
* either of the following licenses
......@@ -84,6 +84,7 @@ public:
inline Size SvLSize() const { return Size( nWidth, nHeight ); }
inline void SvLSize( const Size &rSize );
inline void SvXSize( const Size &rSize );
inline sal_Bool operator==( const SwPosSize &rSize ) const;
inline SwPosSize &operator=( const SwPosSize &rSize );
inline SwPosSize &operator=( const Size &rSize );
......@@ -108,6 +109,12 @@ inline void SwPosSize::SvLSize( const Size &rSize )
nHeight = KSHORT(rSize.Height());
}
inline void SwPosSize::SvXSize( const Size &rSize )
{
nHeight = KSHORT(rSize.Width());
nWidth = KSHORT(rSize.Height());
}
inline SwPosSize &SwPosSize::operator=( const Size &rSize )
{
nWidth = KSHORT(rSize.Width());
......
......@@ -2,9 +2,9 @@
*
* $RCSfile: txtfly.cxx,v $
*
* $Revision: 1.2 $
* $Revision: 1.3 $
*
* last change: $Author: ama $ $Date: 2000-10-17 10:21:27 $
* last change: $Author: ama $ $Date: 2001-02-01 14:05:11 $
*
* The Contents of this file are made available subject to the terms of
* either of the following licenses
......@@ -78,6 +78,9 @@
#include "flyfrm.hxx" // SwFlyFrm
#include "frmtool.hxx" // ::DrawGraphic
#include "porfld.hxx" // SwGrfNumPortion
#ifndef _PORMULTI_HXX
#include <pormulti.hxx> // SwMultiPortion
#endif
#ifdef VERT_DISTANCE
#include <math.h>
......@@ -252,7 +255,8 @@ void SwTxtFormatter::CalcUnclipped( SwTwips& rTop, SwTwips& rBottom )
* ( hauptsaechlich Korrrektur der X-Position )
*************************************************************************/
void SwTxtFormatter::UpdatePos( SwLineLayout *pCurr, sal_Bool bAllWays ) const
void SwTxtFormatter::UpdatePos( SwLineLayout *pCurr, Point aStart,
xub_StrLen nStartIdx, sal_Bool bAllWays ) const
{
if( GetInfo().IsTest() )
return;
......@@ -262,14 +266,33 @@ void SwTxtFormatter::UpdatePos( SwLineLayout *pCurr, sal_Bool bAllWays ) const
aTmpInf.SetSpaceAdd( pCurr->GetpSpaceAdd() );
aTmpInf.ResetSpaceIdx();
// Die Groesse des Frames
aTmpInf.SetIdx( GetStart() );
aTmpInf.SetPos( GetTopLeft() );
aTmpInf.SetIdx( nStartIdx );
aTmpInf.SetPos( aStart );
long nTmpAscent, nTmpDescent, nFlyAsc, nFlyDesc;
lcl_MaxAscDescent( pPos, nTmpAscent, nTmpDescent, nFlyAsc, nFlyDesc );
KSHORT nAscent, nTmpHeight;
CalcAscentAndHeight( nAscent, nTmpHeight );
long nTmpY = Y() + nAscent;
KSHORT nTmpHeight = pCurr->GetRealHeight();
KSHORT nAscent = pCurr->GetAscent() + nTmpHeight - pCurr->Height();
sal_uInt8 nFlags = SETBASE_ULSPACE;
if( GetMulti() )
{
aTmpInf.SetDirection( GetMulti()->GetDirection() );
if( GetMulti()->HasRotation() )
{
nFlags |= SETBASE_ROTATE;
if( GetMulti()->IsRevers() )
{
nFlags |= SETBASE_REVERSE;
aTmpInf.X( aTmpInf.X() - nAscent );
}
else
aTmpInf.X( aTmpInf.X() + nAscent );
}
else
aTmpInf.Y( aTmpInf.Y() + nAscent );
}
else
aTmpInf.Y( aTmpInf.Y() + nAscent );
while( pPos )
{
......@@ -295,11 +318,35 @@ void SwTxtFormatter::UpdatePos( SwLineLayout *pCurr, sal_Bool bAllWays ) const
}
else
{
const Point aBase( aTmpInf.X(), nTmpY );
((SwFlyCntPortion*)pPos)->SetBase( aBase, nTmpAscent,
nTmpDescent, nFlyAsc, nFlyDesc, SETBASE_ULSPACE );
((SwFlyCntPortion*)pPos)->SetBase( aTmpInf.GetPos(), nTmpAscent,
nTmpDescent, nFlyAsc, nFlyDesc, nFlags );
}
}
if( pPos->IsMultiPortion() && ((SwMultiPortion*)pPos)->HasFlyInCntnt() )
{
ASSERT( !GetMulti(), "Too much multi" );
((SwTxtFormatter*)this)->pMulti = (SwMultiPortion*)pPos;
SwLineLayout *pLay = &GetMulti()->GetRoot();
Point aSt( aStart );
if( GetMulti()->HasRotation() )
{
aSt.X() = aTmpInf.X();
aSt.Y() += pCurr->GetAscent() - GetMulti()->GetAscent();
if( GetMulti()->IsRevers() )
aSt.X() += GetMulti()->Width();
else
aSt.Y() += GetMulti()->Height();
}
xub_StrLen nStIdx = aTmpInf.GetIdx();
do
{
UpdatePos( pLay, aSt, nStIdx, bAllWays );
nStIdx += pLay->GetLen();
aSt.Y() += pLay->Height();
pLay = pLay->GetNext();
} while ( pLay );
((SwTxtFormatter*)this)->pMulti = NULL;
}
pPos->Move( aTmpInf );
pPos = pPos->GetPortion();
}
......@@ -316,6 +363,13 @@ void SwTxtFormatter::AlignFlyInCntBase( long nBaseLine ) const
return;
SwLinePortion *pFirst = pCurr->GetFirstPortion();
SwLinePortion *pPos = pFirst;
sal_uInt8 nFlags = SETBASE_NOFLAG;
if( GetMulti() && GetMulti()->HasRotation() )
{
nFlags |= SETBASE_ROTATE;
if( GetMulti()->IsRevers() )
nFlags |= SETBASE_REVERSE;
}
long nTmpAscent, nTmpDescent, nFlyAsc, nFlyDesc;
......@@ -333,7 +387,7 @@ void SwTxtFormatter::AlignFlyInCntBase( long nBaseLine ) const
const Point aBase( ( (SwFlyCntPortion*)pPos)->GetRefPoint().X(),
nBaseLine );
((SwFlyCntPortion*)pPos)->SetBase( aBase, nTmpAscent, nTmpDescent,
nFlyAsc, nFlyDesc, SETBASE_NOFLAG );
nFlyAsc, nFlyDesc, nFlags );
}
}
pPos = pPos->GetPortion();
......@@ -578,11 +632,18 @@ SwFlyCntPortion *SwTxtFormatter::NewFlyCntPortion( SwTxtFormatInfo &rInf,
nFlyAsc = nAscent;
Point aBase( GetLeftMargin() + rInf.X(), Y() + nAscent );
sal_uInt8 nMode = IsQuick() ? SETBASE_QUICK : 0;
if( GetMulti() && GetMulti()->HasRotation() )
{
nMode |= SETBASE_ROTATE;
if( GetMulti()->IsRevers() )
nMode |= SETBASE_REVERSE;
}
if( pFly )
{
pRet = new SwFlyCntPortion( pFly, aBase, nTmpAscent, nTmpDescent,
nFlyAsc, nFlyDesc, IsQuick() );
nFlyAsc, nFlyDesc, nMode );
// Wir muessen sicherstellen, dass unser Font wieder im OutputDevice
// steht. Es koennte sein, dass der FlyInCnt frisch eingefuegt wurde,
// dann hat GetFlyFrm dazu gefuehrt, dass er neu angelegt wird.
......@@ -592,9 +653,7 @@ SwFlyCntPortion *SwTxtFormatter::NewFlyCntPortion( SwTxtFormatInfo &rInf,
if( pRet->GetAscent() > nAscent )
{
aBase.Y() = Y() + pRet->GetAscent();
sal_uInt8 nMode = SETBASE_ULSPACE;
if( IsQuick() )
nMode |= SETBASE_QUICK;
nMode |= SETBASE_ULSPACE;
if( !rInf.IsTest() )
pRet->SetBase( aBase, nTmpAscent, nTmpDescent, nFlyAsc, nFlyDesc,
nMode );
......@@ -603,7 +662,7 @@ SwFlyCntPortion *SwTxtFormatter::NewFlyCntPortion( SwTxtFormatInfo &rInf,
else
{
pRet = new SwFlyCntPortion( (SwDrawContact*)pFrmFmt->FindContactObj(),
aBase, nTmpAscent, nTmpDescent, nFlyAsc, nFlyDesc, IsQuick() );
aBase, nTmpAscent, nTmpDescent, nFlyAsc, nFlyDesc, nMode );
}
return pRet;
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment