summaryrefslogtreecommitdiff
path: root/editeng
diff options
context:
space:
mode:
authorTamás Zolnai <tamas.zolnai@collabora.com>2017-04-05 15:12:11 +0200
committerTamás Zolnai <tamas.zolnai@collabora.com>2017-04-15 15:40:56 +0200
commitc671094154ecec6f3ba5beea9d26ff0d2d4d86ad (patch)
tree3a7d65d16e9161cc5326235041a35ff3e488e54e /editeng
parent727bf1bdd516dc826620ea9254de1b0b76805907 (diff)
Introduce text rotation for Impress tables
* Introduce new table property for text rotation * Support only two rotation angle (270° and 90°) * Implement editing and rendering of 270° rotated text (90° rotation was already implemented) Change-Id: Ifc2e0f171e9c840e86b365e9af2c30aa97ecd92e
Diffstat (limited to 'editeng')
-rw-r--r--editeng/source/editeng/editdoc.cxx3
-rw-r--r--editeng/source/editeng/editdoc.hxx5
-rw-r--r--editeng/source/editeng/editeng.cxx21
-rw-r--r--editeng/source/editeng/editobj.cxx40
-rw-r--r--editeng/source/editeng/editobj2.hxx6
-rw-r--r--editeng/source/editeng/impedit.cxx82
-rw-r--r--editeng/source/editeng/impedit.hxx4
-rw-r--r--editeng/source/editeng/impedit3.cxx161
-rw-r--r--editeng/source/editeng/impedit4.cxx4
-rw-r--r--editeng/source/outliner/outlin2.cxx4
-rw-r--r--editeng/source/outliner/outlobj.cxx12
11 files changed, 270 insertions, 72 deletions
diff --git a/editeng/source/editeng/editdoc.cxx b/editeng/source/editeng/editdoc.cxx
index 5cb51b1ea647..572402936587 100644
--- a/editeng/source/editeng/editdoc.cxx
+++ b/editeng/source/editeng/editdoc.cxx
@@ -1974,6 +1974,7 @@ EditDoc::EditDoc( SfxItemPool* pPool ) :
pItemPool(pPool ? pPool : new EditEngineItemPool(false)),
nDefTab(DEFTAB),
bIsVertical(false),
+ bIsTopToBottomVert(false),
bIsFixedCellHeight(false),
bOwnerOfPool(pPool == nullptr),
bModified(false)
@@ -2108,7 +2109,7 @@ void EditDoc::CreateDefFont( bool bUseStyles )
SfxItemSet aTmpSet( GetItemPool(), EE_PARA_START, EE_CHAR_END );
CreateFont( aDefFont, aTmpSet );
aDefFont.SetVertical( IsVertical() );
- aDefFont.SetOrientation( IsVertical() ? 2700 : 0 );
+ aDefFont.SetOrientation( IsVertical() ? (IsTopToBottom() ? 2700 : 900) : 0 );
for ( sal_Int32 nNode = 0; nNode < Count(); nNode++ )
{
diff --git a/editeng/source/editeng/editdoc.hxx b/editeng/source/editeng/editdoc.hxx
index a31eaefc5739..d1c921d74d49 100644
--- a/editeng/source/editeng/editdoc.hxx
+++ b/editeng/source/editeng/editdoc.hxx
@@ -746,6 +746,7 @@ private:
SvxFont aDefFont; //faster than ever from the pool!!
sal_uInt16 nDefTab;
bool bIsVertical:1;
+ bool bIsTopToBottomVert : 1;
bool bIsFixedCellHeight:1;
bool bOwnerOfPool:1;
@@ -772,8 +773,10 @@ public:
void SetDefTab( sal_uInt16 nTab ) { nDefTab = nTab ? nTab : DEFTAB; }
sal_uInt16 GetDefTab() const { return nDefTab; }
- void SetVertical( bool bVertical ) { bIsVertical = bVertical; }
+ void SetVertical( bool bVertical, bool bTopToBottom = true )
+ { bIsVertical = bVertical; bIsTopToBottomVert = bVertical && bTopToBottom; }
bool IsVertical() const { return bIsVertical; }
+ bool IsTopToBottom() const { return bIsTopToBottomVert; }
void SetFixedCellHeight( bool bUseFixedCellHeight ) { bIsFixedCellHeight = bUseFixedCellHeight; }
bool IsFixedCellHeight() const { return bIsFixedCellHeight; }
diff --git a/editeng/source/editeng/editeng.cxx b/editeng/source/editeng/editeng.cxx
index 4e2aa8d4cfe2..0a4c315bf970 100644
--- a/editeng/source/editeng/editeng.cxx
+++ b/editeng/source/editeng/editeng.cxx
@@ -428,9 +428,9 @@ const Size& EditEngine::GetPaperSize() const
return pImpEditEngine->GetPaperSize();
}
-void EditEngine::SetVertical( bool bVertical )
+void EditEngine::SetVertical( bool bVertical, bool bTopToBottom )
{
- pImpEditEngine->SetVertical( bVertical );
+ pImpEditEngine->SetVertical( bVertical, bTopToBottom);
}
bool EditEngine::IsVertical() const
@@ -438,6 +438,11 @@ bool EditEngine::IsVertical() const
return pImpEditEngine->IsVertical();
}
+bool EditEngine::IsTopToBottom() const
+{
+ return pImpEditEngine->IsTopToBottom();
+}
+
void EditEngine::SetFixedCellHeight( bool bUseFixedCellHeight )
{
pImpEditEngine->SetFixedCellHeight( bUseFixedCellHeight );
@@ -1777,8 +1782,16 @@ void EditEngine::StripPortions()
tools::Rectangle aBigRect( Point( 0, 0 ), Size( 0x7FFFFFFF, 0x7FFFFFFF ) );
if ( IsVertical() )
{
- aBigRect.Right() = 0;
- aBigRect.Left() = -0x7FFFFFFF;
+ if( IsTopToBottom() )
+ {
+ aBigRect.Right() = 0;
+ aBigRect.Left() = -0x7FFFFFFF;
+ }
+ else
+ {
+ aBigRect.Top() = -0x7FFFFFFF;
+ aBigRect.Bottom() = 0;
+ }
}
pImpEditEngine->Paint( aTmpDev.get(), aBigRect, Point(), true );
}
diff --git a/editeng/source/editeng/editobj.cxx b/editeng/source/editeng/editobj.cxx
index 17f9f13e9497..778bb6677f5d 100644
--- a/editeng/source/editeng/editobj.cxx
+++ b/editeng/source/editeng/editobj.cxx
@@ -356,9 +356,14 @@ bool EditTextObject::IsVertical() const
return mpImpl->IsVertical();
}
-void EditTextObject::SetVertical( bool bVertical )
+bool EditTextObject::IsTopToBottom() const
{
- return mpImpl->SetVertical(bVertical);
+ return mpImpl->IsTopToBottom();
+}
+
+void EditTextObject::SetVertical( bool bVertical, bool bTopToBottom )
+{
+ return mpImpl->SetVertical(bVertical, bTopToBottom);
}
SvtScriptType EditTextObject::GetScriptType() const
@@ -560,6 +565,7 @@ EditTextObjectImpl::EditTextObjectImpl( EditTextObject* pFront, SfxItemPool* pP
}
bVertical = false;
+ bIsTopToBottomVert = false;
bStoreUnicodeStrings = false;
nScriptType = SvtScriptType::NONE;
}
@@ -572,6 +578,7 @@ EditTextObjectImpl::EditTextObjectImpl( EditTextObject* pFront, const EditTextOb
nUserType = r.nUserType;
nObjSettings = r.nObjSettings;
bVertical = r.bVertical;
+ bIsTopToBottomVert = r.bIsTopToBottomVert;
nScriptType = r.nScriptType;
pPortionInfo = nullptr; // Do not copy PortionInfo
bStoreUnicodeStrings = false;
@@ -653,12 +660,22 @@ std::vector<svl::SharedString> EditTextObjectImpl::GetSharedStrings() const
return aSSs;
}
+bool EditTextObjectImpl::IsVertical() const
+{
+ return bVertical;
+}
+
+bool EditTextObjectImpl::IsTopToBottom() const
+{
+ return bIsTopToBottomVert;
+}
-void EditTextObjectImpl::SetVertical( bool b )
+void EditTextObjectImpl::SetVertical( bool bVert, bool bTopToBottom)
{
- if ( b != bVertical )
+ if (bVert != bVertical || bTopToBottom != (bVert && bIsTopToBottomVert))
{
- bVertical = b;
+ bVertical = bVert;
+ bIsTopToBottomVert = bVert && bTopToBottom;
ClearPortionInfo();
}
}
@@ -1088,7 +1105,7 @@ public:
void EditTextObjectImpl::StoreData( SvStream& rOStream ) const
{
- sal_uInt16 nVer = 602;
+ sal_uInt16 nVer = 603;
rOStream.WriteUInt16( nVer );
rOStream.WriteBool( bOwnerOfPool );
@@ -1235,6 +1252,7 @@ void EditTextObjectImpl::StoreData( SvStream& rOStream ) const
rOStream.WriteUInt32( nObjSettings );
rOStream.WriteBool( bVertical );
+ rOStream.WriteBool( bIsTopToBottomVert );
rOStream.WriteUInt16( static_cast<sal_uInt16>(nScriptType) );
rOStream.WriteBool( bStoreUnicodeStrings );
@@ -1487,6 +1505,13 @@ void EditTextObjectImpl::CreateData( SvStream& rIStream )
bVertical = bTmp;
}
+ if (nVersion >= 603)
+ {
+ bool bTmp(false);
+ rIStream.ReadCharAsBool(bTmp);
+ bIsTopToBottomVert = bTmp;
+ }
+
if ( nVersion >= 602 )
{
sal_uInt16 aTmp16;
@@ -1577,7 +1602,8 @@ bool EditTextObjectImpl::operator==( const EditTextObjectImpl& rCompare ) const
( nMetric != rCompare.nMetric ) ||
( nUserType!= rCompare.nUserType ) ||
( nScriptType != rCompare.nScriptType ) ||
- ( bVertical != rCompare.bVertical ) )
+ ( bVertical != rCompare.bVertical ) ||
+ ( bIsTopToBottomVert != rCompare.bIsTopToBottomVert ) )
return false;
for (size_t i = 0, n = aContents.size(); i < n; ++i)
diff --git a/editeng/source/editeng/editobj2.hxx b/editeng/source/editeng/editobj2.hxx
index d9efd1fb200d..928f4ba12b84 100644
--- a/editeng/source/editeng/editobj2.hxx
+++ b/editeng/source/editeng/editobj2.hxx
@@ -182,6 +182,7 @@ private:
bool bOwnerOfPool:1;
bool bVertical:1;
+ bool bIsTopToBottomVert : 1;
bool bStoreUnicodeStrings:1;
bool ImpChangeStyleSheets( const OUString& rOldName, SfxStyleFamily eOldFamily,
@@ -204,8 +205,9 @@ public:
void NormalizeString( svl::SharedStringPool& rPool );
std::vector<svl::SharedString> GetSharedStrings() const;
- bool IsVertical() const { return bVertical;}
- void SetVertical( bool b );
+ bool IsVertical() const;
+ bool IsTopToBottom() const;
+ void SetVertical( bool bVert, bool bTopToBottom = true);
SvtScriptType GetScriptType() const { return nScriptType;}
void SetScriptType( SvtScriptType nType );
diff --git a/editeng/source/editeng/impedit.cxx b/editeng/source/editeng/impedit.cxx
index 25df5d898fd8..43cb55259fb9 100644
--- a/editeng/source/editeng/impedit.cxx
+++ b/editeng/source/editeng/impedit.cxx
@@ -513,6 +513,11 @@ bool ImpEditView::IsVertical() const
return pEditEngine->pImpEditEngine->IsVertical();
}
+bool ImpEditView::IsTopToBottom() const
+{
+ return pEditEngine->pImpEditEngine->IsTopToBottom();
+}
+
tools::Rectangle ImpEditView::GetVisDocArea() const
{
return tools::Rectangle( GetVisDocLeft(), GetVisDocTop(), GetVisDocRight(), GetVisDocBottom() );
@@ -530,8 +535,16 @@ Point ImpEditView::GetDocPos( const Point& rWindowPos ) const
}
else
{
- aPoint.X() = rWindowPos.Y() - aOutArea.Top() + GetVisDocLeft();
- aPoint.Y() = aOutArea.Right() - rWindowPos.X() + GetVisDocTop();
+ if (pEditEngine->pImpEditEngine->IsTopToBottom())
+ {
+ aPoint.X() = rWindowPos.Y() - aOutArea.Top() + GetVisDocLeft();
+ aPoint.Y() = aOutArea.Right() - rWindowPos.X() + GetVisDocTop();
+ }
+ else
+ {
+ aPoint.X() = aOutArea.Bottom() - rWindowPos.Y() + GetVisDocLeft();
+ aPoint.Y() = rWindowPos.X() - aOutArea.Left() + GetVisDocTop();
+ }
}
return aPoint;
@@ -549,8 +562,16 @@ Point ImpEditView::GetWindowPos( const Point& rDocPos ) const
}
else
{
- aPoint.X() = aOutArea.Right() - rDocPos.Y() + GetVisDocTop();
- aPoint.Y() = rDocPos.X() + aOutArea.Top() - GetVisDocLeft();
+ if (pEditEngine->pImpEditEngine->IsTopToBottom())
+ {
+ aPoint.X() = aOutArea.Right() - rDocPos.Y() + GetVisDocTop();
+ aPoint.Y() = rDocPos.X() + aOutArea.Top() - GetVisDocLeft();
+ }
+ else
+ {
+ aPoint.X() = aOutArea.Left() + rDocPos.Y() - GetVisDocTop();
+ aPoint.Y() = aOutArea.Bottom() - rDocPos.X() + GetVisDocLeft();
+ }
}
return aPoint;
@@ -916,8 +937,8 @@ void ImpEditView::ShowCursor( bool bGotoCursor, bool bForceVisCursor )
if ( nDocDiffX | nDocDiffY )
{
- long nDiffX = !IsVertical() ? nDocDiffX : -nDocDiffY;
- long nDiffY = !IsVertical() ? nDocDiffY : nDocDiffX;
+ long nDiffX = !IsVertical() ? nDocDiffX : (IsTopToBottom() ? -nDocDiffY : nDocDiffY);
+ long nDiffY = !IsVertical() ? nDocDiffY : (IsTopToBottom() ? nDocDiffX : -nDocDiffX);
// Negative: Back to the top or left edge
if ( ( std::abs( nDiffY ) > pEditEngine->GetOnePixelInRef() ) && DoBigScroll() )
@@ -993,7 +1014,7 @@ void ImpEditView::ShowCursor( bool bGotoCursor, bool bForceVisCursor )
aCursorSz.Width() = aOldSz.Height();
aCursorSz.Height() = aOldSz.Width();
GetCursor()->SetPos( aCursorRect.TopRight() );
- GetCursor()->SetOrientation( 2700 );
+ GetCursor()->SetOrientation( IsTopToBottom() ? 2700 : 900 );
}
else
// #i32593# Reset correct orientation in horizontal layout
@@ -1087,8 +1108,16 @@ Pair ImpEditView::Scroll( long ndX, long ndY, ScrollRangeCheck nRangeCheck )
}
else
{
- aNewVisArea.Top() += ndX;
- aNewVisArea.Bottom() += ndX;
+ if( IsTopToBottom() )
+ {
+ aNewVisArea.Top() += ndX;
+ aNewVisArea.Bottom() += ndX;
+ }
+ else
+ {
+ aNewVisArea.Top() -= ndX;
+ aNewVisArea.Bottom() -= ndX;
+ }
}
if ( ( nRangeCheck == ScrollRangeCheck::PaperWidthTextSize ) && ( aNewVisArea.Bottom() > (long)pEditEngine->pImpEditEngine->GetTextHeight() ) )
{
@@ -1107,8 +1136,16 @@ Pair ImpEditView::Scroll( long ndX, long ndY, ScrollRangeCheck nRangeCheck )
}
else
{
- aNewVisArea.Left() -= ndY;
- aNewVisArea.Right() -= ndY;
+ if (IsTopToBottom())
+ {
+ aNewVisArea.Left() -= ndY;
+ aNewVisArea.Right() -= ndY;
+ }
+ else
+ {
+ aNewVisArea.Left() += ndY;
+ aNewVisArea.Right() += ndY;
+ }
}
if ( ( nRangeCheck == ScrollRangeCheck::PaperWidthTextSize ) && ( aNewVisArea.Right() > (long)pEditEngine->pImpEditEngine->CalcTextWidth( false ) ) )
{
@@ -1119,8 +1156,8 @@ Pair ImpEditView::Scroll( long ndX, long ndY, ScrollRangeCheck nRangeCheck )
aNewVisArea.Move( -aNewVisArea.Left(), 0 );
// The difference must be alignt on pixel (due to scroll!)
- long nDiffX = !IsVertical() ? ( GetVisDocLeft() - aNewVisArea.Left() ) : -( GetVisDocTop() - aNewVisArea.Top() );
- long nDiffY = !IsVertical() ? ( GetVisDocTop() - aNewVisArea.Top() ) : ( GetVisDocLeft() - aNewVisArea.Left() );
+ long nDiffX = !IsVertical() ? ( GetVisDocLeft() - aNewVisArea.Left() ) : (IsTopToBottom() ? -( GetVisDocTop() - aNewVisArea.Top() ) : (GetVisDocTop() - aNewVisArea.Top()));
+ long nDiffY = !IsVertical() ? ( GetVisDocTop() - aNewVisArea.Top() ) : (IsTopToBottom() ? (GetVisDocLeft() - aNewVisArea.Left()) : -(GetVisDocTop() - aNewVisArea.Top()));
Size aDiffs( nDiffX, nDiffY );
aDiffs = pOutWin->LogicToPixel( aDiffs );
@@ -1139,7 +1176,12 @@ Pair ImpEditView::Scroll( long ndX, long ndY, ScrollRangeCheck nRangeCheck )
if ( !IsVertical() )
aVisDocStartPos.Move( -nRealDiffX, -nRealDiffY );
else
- aVisDocStartPos.Move( -nRealDiffY, nRealDiffX );
+ {
+ if (IsTopToBottom())
+ aVisDocStartPos.Move(-nRealDiffY, nRealDiffX);
+ else
+ aVisDocStartPos.Move(nRealDiffY, -nRealDiffX);
+ }
// Move by aligned value does not necessarily result in aligned
// rectangle ...
aVisDocStartPos = pOutWin->LogicToPixel( aVisDocStartPos );
@@ -2101,8 +2143,16 @@ void ImpEditView::dragOver(const css::datatransfer::dnd::DropTargetDragEvent& rD
}
else
{
- aEditCursor.Left()--;
- aEditCursor.Right()++;
+ if( IsTopToBottom() )
+ {
+ aEditCursor.Left()--;
+ aEditCursor.Right()++;
+ }
+ else
+ {
+ aEditCursor.Left()++;
+ aEditCursor.Right()--;
+ }
}
aEditCursor = GetWindow()->PixelToLogic( aEditCursor );
}
diff --git a/editeng/source/editeng/impedit.hxx b/editeng/source/editeng/impedit.hxx
index fe0ce85c2386..651441ab8fab 100644
--- a/editeng/source/editeng/impedit.hxx
+++ b/editeng/source/editeng/impedit.hxx
@@ -295,6 +295,7 @@ public:
const tools::Rectangle& GetOutputArea() const { return aOutArea; }
bool IsVertical() const;
+ bool IsTopToBottom() const;
bool PostKeyEvent( const KeyEvent& rKeyEvent, vcl::Window* pFrameWin );
@@ -722,8 +723,9 @@ public:
const Size& GetPaperSize() const { return aPaperSize; }
void SetPaperSize( const Size& rSz ) { aPaperSize = rSz; }
- void SetVertical( bool bVertical );
+ void SetVertical( bool bVertical, bool bTopToBottom = true);
bool IsVertical() const { return GetEditDoc().IsVertical(); }
+ bool IsTopToBottom() const { return GetEditDoc().IsTopToBottom(); }
bool IsPageOverflow( ) const;
diff --git a/editeng/source/editeng/impedit3.cxx b/editeng/source/editeng/impedit3.cxx
index 4e656233dac0..462229e2f25e 100644
--- a/editeng/source/editeng/impedit3.cxx
+++ b/editeng/source/editeng/impedit3.cxx
@@ -2580,11 +2580,11 @@ void ImpEditEngine::SetTextRanger( TextRanger* pRanger )
}
}
-void ImpEditEngine::SetVertical( bool bVertical )
+void ImpEditEngine::SetVertical( bool bVertical, bool bTopToBottom)
{
- if ( IsVertical() != bVertical )
+ if ( IsVertical() != bVertical || IsTopToBottom() != (bVertical && bTopToBottom))
{
- GetEditDoc().SetVertical( bVertical );
+ GetEditDoc().SetVertical( bVertical, bTopToBottom);
bool bUseCharAttribs = bool(aStatus.GetControlWord() & EEControlBits::USECHARATTRIBS);
GetEditDoc().CreateDefFont( bUseCharAttribs );
if ( IsFormatted() )
@@ -2963,7 +2963,8 @@ void ImpEditEngine::Paint( OutputDevice* pOutDev, tools::Rectangle aClipRect, Po
sal_Int32 nIndex = 0;
if ( pPortion->IsVisible() && (
( !IsVertical() && ( ( aStartPos.Y() + nParaHeight ) > aClipRect.Top() ) ) ||
- ( IsVertical() && ( ( aStartPos.X() - nParaHeight ) < aClipRect.Right() ) ) ) )
+ ( IsVertical() && IsTopToBottom() && ( ( aStartPos.X() - nParaHeight ) < aClipRect.Right() ) ) ||
+ ( IsVertical() && !IsTopToBottom() && ( ( aStartPos.X() + nParaHeight ) > aClipRect.Left() ) ) ) )
{
@@ -2977,7 +2978,12 @@ void ImpEditEngine::Paint( OutputDevice* pOutDev, tools::Rectangle aClipRect, Po
if ( !IsVertical() )
aStartPos.Y() += pPortion->GetFirstLineOffset();
else
- aStartPos.X() -= pPortion->GetFirstLineOffset();
+ {
+ if( IsTopToBottom() )
+ aStartPos.X() -= pPortion->GetFirstLineOffset();
+ else
+ aStartPos.X() += pPortion->GetFirstLineOffset();
+ }
Point aParaStart( aStartPos );
@@ -3002,15 +3008,27 @@ void ImpEditEngine::Paint( OutputDevice* pOutDev, tools::Rectangle aClipRect, Po
}
else
{
- aTmpPos.Y() += pLine->GetStartPosX();
- aTmpPos.X() -= pLine->GetMaxAscent();
- aStartPos.X() -= pLine->GetHeight();
- if (nLine != nLastLine)
- aStartPos.X() -= nVertLineSpacing;
+ if ( IsTopToBottom() )
+ {
+ aTmpPos.Y() += pLine->GetStartPosX();
+ aTmpPos.X() -= pLine->GetMaxAscent();
+ aStartPos.X() -= pLine->GetHeight();
+ if (nLine != nLastLine)
+ aStartPos.X() -= nVertLineSpacing;
+ }
+ else
+ {
+ aTmpPos.Y() -= pLine->GetStartPosX();
+ aTmpPos.X() += pLine->GetMaxAscent();
+ aStartPos.X() += pLine->GetHeight();
+ if (nLine != nLastLine)
+ aStartPos.X() += nVertLineSpacing;
+ }
}
if ( ( !IsVertical() && ( aStartPos.Y() > aClipRect.Top() ) )
- || ( IsVertical() && aStartPos.X() < aClipRect.Right() ) )
+ || ( IsVertical() && IsTopToBottom() && aStartPos.X() < aClipRect.Right() )
+ || ( IsVertical() && !IsTopToBottom() && aStartPos.X() > aClipRect.Left() ) )
{
bPaintBullet = false;
@@ -3048,9 +3066,18 @@ void ImpEditEngine::Paint( OutputDevice* pOutDev, tools::Rectangle aClipRect, Po
}
else
{
- aTmpPos.Y() = aStartPos.Y() + nPortionXOffset;
- if ( aTmpPos.Y() > aClipRect.Bottom() )
- break; // No further output in line necessary
+ if( IsTopToBottom() )
+ {
+ aTmpPos.Y() = aStartPos.Y() + nPortionXOffset;
+ if ( aTmpPos.Y() > aClipRect.Bottom() )
+ break; // No further output in line necessary
+ }
+ else
+ {
+ aTmpPos.Y() = aStartPos.Y() - nPortionXOffset;
+ if (aTmpPos.Y() < aClipRect.Top())
+ break; // No further output in line necessary
+ }
}
switch ( rTextPortion.GetKind() )
@@ -3141,8 +3168,16 @@ void ImpEditEngine::Paint( OutputDevice* pOutDev, tools::Rectangle aClipRect, Po
}
else
{
- aTopLeftRectPos.Y() += nAdvanceX;
- aTopLeftRectPos.X() -= nAdvanceY;
+ if( IsTopToBottom() )
+ {
+ aTopLeftRectPos.Y() -= nAdvanceX;
+ aTopLeftRectPos.X() += nAdvanceY;
+ }
+ else
+ {
+ aTopLeftRectPos.Y() += nAdvanceX;
+ aTopLeftRectPos.X() -= nAdvanceY;
+ }
}
Point aBottomRightRectPos( aTopLeftRectPos );
@@ -3153,8 +3188,16 @@ void ImpEditEngine::Paint( OutputDevice* pOutDev, tools::Rectangle aClipRect, Po
}
else
{
- aBottomRightRectPos.X() -= pLine->GetHeight();
- aBottomRightRectPos.Y() += 2 * nHalfBlankWidth;
+ if (IsTopToBottom())
+ {
+ aBottomRightRectPos.X() += pLine->GetHeight();
+ aBottomRightRectPos.Y() -= 2 * nHalfBlankWidth;
+ }
+ else
+ {
+ aBottomRightRectPos.X() -= pLine->GetHeight();
+ aBottomRightRectPos.Y() += 2 * nHalfBlankWidth;
+ }
}
pOutDev->Push( PushFlags::FILLCOLOR );
@@ -3187,7 +3230,10 @@ void ImpEditEngine::Paint( OutputDevice* pOutDev, tools::Rectangle aClipRect, Po
}
else
{
- aSlashPos.Y() = aTopLeftRectPos.Y() + nAddX;
+ if (IsTopToBottom())
+ aSlashPos.Y() = aTopLeftRectPos.Y() + nAddX;
+ else
+ aSlashPos.Y() = aTopLeftRectPos.Y() - nAddX;
}
aTmpFont.QuickDrawText( pOutDev, aSlashPos, aSlash, 0, 1 );
@@ -3226,8 +3272,16 @@ void ImpEditEngine::Paint( OutputDevice* pOutDev, tools::Rectangle aClipRect, Po
}
else
{
- aTmpPos.X() -= pLine->GetMaxAscent();
- aStartPos.X() -= pLine->GetHeight();
+ if (IsTopToBottom())
+ {
+ aTmpPos.X() -= pLine->GetMaxAscent();
+ aStartPos.X() -= pLine->GetHeight();
+ }
+ else
+ {
+ aTmpPos.X() += pLine->GetMaxAscent();
+ aStartPos.X() += pLine->GetHeight();
+ }
}
}
std::vector< sal_Int32 >::iterator curIt = itSubLines;
@@ -3404,7 +3458,12 @@ void ImpEditEngine::Paint( OutputDevice* pOutDev, tools::Rectangle aClipRect, Po
if ( !IsVertical() )
aOutPos.Y() -= nDiff;
else
- aOutPos.X() += nDiff;
+ {
+ if (IsTopToBottom())
+ aOutPos.X() += nDiff;
+ else
+ aOutPos.X() -= nDiff;
+ }
aRedLineTmpPos = aOutPos;
aTmpFont.SetEscapement( 0 );
}
@@ -3534,7 +3593,10 @@ void ImpEditEngine::Paint( OutputDevice* pOutDev, tools::Rectangle aClipRect, Po
if( !IsVertical() )
aRedLineTmpPos.Y() -= nShift;
else
- aRedLineTmpPos.X() += nShift;
+ if (IsTopToBottom())
+ aRedLineTmpPos.X() += nShift;
+ else
+ aRedLineTmpPos.X() -= nShift;
}
}
Color aOldColor( pOutDev->GetLineColor() );
@@ -3651,13 +3713,20 @@ void ImpEditEngine::Paint( OutputDevice* pOutDev, tools::Rectangle aClipRect, Po
if ( !IsVertical() )
aStartPos.Y() += nSBL;
else
- aStartPos.X() -= nSBL;
+ {
+ if( IsTopToBottom() )
+ aStartPos.X() -= nSBL;
+ else
+ aStartPos.X() += nSBL;
+ }
}
// no more visible actions?
if ( !IsVertical() && ( aStartPos.Y() >= aClipRect.Bottom() ) )
break;
- else if ( IsVertical() && ( aStartPos.X() <= aClipRect.Left() ) )
+ else if ( IsVertical() && IsTopToBottom() && ( aStartPos.X() <= aClipRect.Left() ) )
+ break;
+ else if (IsVertical() && !IsTopToBottom() && (aStartPos.X() >= aClipRect.Right()))
break;
}
@@ -3668,7 +3737,12 @@ void ImpEditEngine::Paint( OutputDevice* pOutDev, tools::Rectangle aClipRect, Po
if ( !IsVertical() )
aStartPos.Y() += nUL;
else
- aStartPos.X() -= nUL;
+ {
+ if (IsTopToBottom())
+ aStartPos.X() -= nUL;
+ else
+ aStartPos.X() += nUL;
+ }
}
// #108052# Safer way for #i108052# and #i118881#: If for the current ParaPortion
@@ -3697,7 +3771,12 @@ void ImpEditEngine::Paint( OutputDevice* pOutDev, tools::Rectangle aClipRect, Po
if ( !IsVertical() )
aStartPos.Y() += nParaHeight;
else
- aStartPos.X() -= nParaHeight;
+ {
+ if (IsTopToBottom())
+ aStartPos.X() -= nParaHeight;
+ else
+ aStartPos.X() += nParaHeight;
+ }
}
if ( pPDFExtOutDevData )
@@ -3706,7 +3785,9 @@ void ImpEditEngine::Paint( OutputDevice* pOutDev, tools::Rectangle aClipRect, Po
// no more visible actions?
if ( !IsVertical() && ( aStartPos.Y() > aClipRect.Bottom() ) )
break;
- if ( IsVertical() && ( aStartPos.X() < aClipRect.Left() ) )
+ if ( IsVertical() && IsTopToBottom() && ( aStartPos.X() < aClipRect.Left() ) )
+ break;
+ if (IsVertical() && !IsTopToBottom() && ( aStartPos.X() > aClipRect.Right() ) )
break;
}
if ( aStatus.DoRestoreFont() )
@@ -3735,9 +3816,18 @@ void ImpEditEngine::Paint( ImpEditView* pView, const tools::Rectangle& rRect, Ou
}
else
{
- aStartPos = pView->GetOutputArea().TopRight();
- aStartPos.X() += pView->GetVisDocTop();
- aStartPos.Y() -= pView->GetVisDocLeft();
+ if( IsTopToBottom() )
+ {
+ aStartPos = pView->GetOutputArea().TopRight();
+ aStartPos.X() += pView->GetVisDocTop();
+ aStartPos.Y() -= pView->GetVisDocLeft();
+ }
+ else
+ {
+ aStartPos = pView->GetOutputArea().BottomLeft();
+ aStartPos.X() -= pView->GetVisDocTop();
+ aStartPos.Y() += pView->GetVisDocLeft();
+ }
}
// If Doc-width < Output Area,Width and not wrapped fields,
@@ -4029,8 +4119,13 @@ long ImpEditEngine::CalcVertLineSpacing(Point& rStartPos) const
return 0;
if (IsVertical())
- // Shift the text to the right for the asian layout mode.
- rStartPos.X() += nTotalSpace;
+ {
+ if( IsTopToBottom() )
+ // Shift the text to the right for the asian layout mode.
+ rStartPos.X() += nTotalSpace;
+ else
+ rStartPos.X() -= nTotalSpace;
+ }
return nTotalSpace / (nTotalLineCount-1);
}
diff --git a/editeng/source/editeng/impedit4.cxx b/editeng/source/editeng/impedit4.cxx
index 99a926075737..ab1db9862c79 100644
--- a/editeng/source/editeng/impedit4.cxx
+++ b/editeng/source/editeng/impedit4.cxx
@@ -1023,7 +1023,7 @@ EditTextObject* ImpEditEngine::CreateTextObject(const EditSelection& rSel)
EditTextObject* ImpEditEngine::CreateTextObject( EditSelection aSel, SfxItemPool* pPool, bool bAllowBigObjects, sal_Int32 nBigObjectStart )
{
EditTextObject* pTxtObj = new EditTextObject(pPool);
- pTxtObj->SetVertical( IsVertical() );
+ pTxtObj->SetVertical( IsVertical(), IsTopToBottom());
MapUnit eMapUnit = aEditDoc.GetItemPool().GetMetric( DEF_METRIC );
pTxtObj->mpImpl->SetMetric( (sal_uInt16) eMapUnit );
if ( pTxtObj->mpImpl->IsOwnerOfPool() )
@@ -1181,7 +1181,7 @@ void ImpEditEngine::SetText( const EditTextObject& rTextObject )
EnableUndo( false );
InsertText( rTextObject, EditSelection( aPaM, aPaM ) );
- SetVertical( rTextObject.IsVertical() );
+ SetVertical( rTextObject.IsVertical(), rTextObject.IsTopToBottom());
DBG_ASSERT( !HasUndoManager() || !GetUndoManager().GetUndoActionCount(), "From where comes the Undo in SetText ?!" );
SetUpdateMode( _bUpdate );
diff --git a/editeng/source/outliner/outlin2.cxx b/editeng/source/outliner/outlin2.cxx
index d3504c94b24f..08495c39fa07 100644
--- a/editeng/source/outliner/outlin2.cxx
+++ b/editeng/source/outliner/outlin2.cxx
@@ -526,9 +526,9 @@ const EditEngine& Outliner::GetEditEngine() const
return *pEditEngine;
}
-void Outliner::SetVertical( bool b )
+void Outliner::SetVertical( bool bVertical, bool bTopToBottom)
{
- pEditEngine->SetVertical( b );
+ pEditEngine->SetVertical(bVertical, bTopToBottom);
}
bool Outliner::IsVertical() const
diff --git a/editeng/source/outliner/outlobj.cxx b/editeng/source/outliner/outlobj.cxx
index 539e4c2b2652..1cbd51f5700c 100644
--- a/editeng/source/outliner/outlobj.cxx
+++ b/editeng/source/outliner/outlobj.cxx
@@ -130,12 +130,18 @@ bool OutlinerParaObject::IsVertical() const
return mpImpl->mpEditTextObject->IsVertical();
}
-void OutlinerParaObject::SetVertical(bool bNew)
+bool OutlinerParaObject::IsTopToBottom() const
+{
+ return mpImpl->mpEditTextObject->IsTopToBottom();
+}
+
+void OutlinerParaObject::SetVertical(bool bNew, bool bTopToBottom)
{
const ::o3tl::cow_wrapper< OutlinerParaObjData >* pImpl = &mpImpl;
- if ( ( *pImpl )->mpEditTextObject->IsVertical() != bNew )
+ if ( ( *pImpl )->mpEditTextObject->IsVertical() != bNew ||
+ (*pImpl)->mpEditTextObject->IsTopToBottom() != (bNew && bTopToBottom))
{
- mpImpl->mpEditTextObject->SetVertical(bNew);
+ mpImpl->mpEditTextObject->SetVertical(bNew, bTopToBottom);
}
}