diff options
author | Tamás Zolnai <tamas.zolnai@collabora.com> | 2017-04-05 15:12:11 +0200 |
---|---|---|
committer | Tamás Zolnai <tamas.zolnai@collabora.com> | 2017-04-15 15:40:56 +0200 |
commit | c671094154ecec6f3ba5beea9d26ff0d2d4d86ad (patch) | |
tree | 3a7d65d16e9161cc5326235041a35ff3e488e54e /editeng | |
parent | 727bf1bdd516dc826620ea9254de1b0b76805907 (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.cxx | 3 | ||||
-rw-r--r-- | editeng/source/editeng/editdoc.hxx | 5 | ||||
-rw-r--r-- | editeng/source/editeng/editeng.cxx | 21 | ||||
-rw-r--r-- | editeng/source/editeng/editobj.cxx | 40 | ||||
-rw-r--r-- | editeng/source/editeng/editobj2.hxx | 6 | ||||
-rw-r--r-- | editeng/source/editeng/impedit.cxx | 82 | ||||
-rw-r--r-- | editeng/source/editeng/impedit.hxx | 4 | ||||
-rw-r--r-- | editeng/source/editeng/impedit3.cxx | 161 | ||||
-rw-r--r-- | editeng/source/editeng/impedit4.cxx | 4 | ||||
-rw-r--r-- | editeng/source/outliner/outlin2.cxx | 4 | ||||
-rw-r--r-- | editeng/source/outliner/outlobj.cxx | 12 |
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); } } |