diff options
25 files changed, 360 insertions, 97 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); } } diff --git a/include/editeng/charrotateitem.hxx b/include/editeng/charrotateitem.hxx index fec33b5d4944..292712cc6823 100644 --- a/include/editeng/charrotateitem.hxx +++ b/include/editeng/charrotateitem.hxx @@ -63,6 +63,7 @@ public: void SetBottomToTop() { SetValue(900); } bool IsTopToBottom() const { return 2700 == GetValue(); } bool IsBottomToTop() const { return 900 == GetValue(); } + bool IsVertical() const { return IsTopToBottom() || IsBottomToTop(); } void dumpAsXml(struct _xmlTextWriter* pWriter) const override; }; diff --git a/include/editeng/editeng.hxx b/include/editeng/editeng.hxx index a8fa950a6805..6b3ba51a6578 100644 --- a/include/editeng/editeng.hxx +++ b/include/editeng/editeng.hxx @@ -242,8 +242,9 @@ public: void SetPaperSize( const Size& rSize ); const Size& GetPaperSize() const; - void SetVertical( bool bVertical ); + void SetVertical( bool bVertical, bool bTopToBottom = true ); bool IsVertical() const; + bool IsTopToBottom() const; void SetFixedCellHeight( bool bUseFixedCellHeight ); diff --git a/include/editeng/editobj.hxx b/include/editeng/editobj.hxx index 509954069b09..2833be068fa7 100644 --- a/include/editeng/editobj.hxx +++ b/include/editeng/editobj.hxx @@ -86,7 +86,8 @@ public: void SetUserType( OutlinerMode n ); bool IsVertical() const; - void SetVertical( bool bVertical ); + bool IsTopToBottom() const; + void SetVertical( bool bVertical, bool bTopToBottom = true); SvtScriptType GetScriptType() const; diff --git a/include/editeng/outliner.hxx b/include/editeng/outliner.hxx index 665497ed33a3..5d2ce0044517 100644 --- a/include/editeng/outliner.hxx +++ b/include/editeng/outliner.hxx @@ -684,7 +684,7 @@ public: void Init( OutlinerMode nOutlinerMode ); OutlinerMode GetMode() const { return nOutlinerMode; } - void SetVertical( bool bVertical ); + void SetVertical( bool bVertical, bool bTopToBottom = true); bool IsVertical() const; void SetFixedCellHeight( bool bUseFixedCellHeight ); diff --git a/include/editeng/outlobj.hxx b/include/editeng/outlobj.hxx index b296d7907376..1477e38d8b5b 100644 --- a/include/editeng/outlobj.hxx +++ b/include/editeng/outlobj.hxx @@ -81,7 +81,8 @@ public: // vertical access bool IsVertical() const; - void SetVertical(bool bNew); + bool IsTopToBottom() const; + void SetVertical(bool bNew, bool bTopToBottom = true); // data read access sal_Int32 Count() const; diff --git a/include/svx/svddef.hxx b/include/svx/svddef.hxx index f3bf1ea8484a..2afa2f94f4b8 100644 --- a/include/svx/svddef.hxx +++ b/include/svx/svddef.hxx @@ -296,8 +296,9 @@ #define SDRATTR_TABLE_BORDER_INNER (SDRATTR_TABLE_FIRST+1) #define SDRATTR_TABLE_BORDER_TLBR (SDRATTR_TABLE_FIRST+2) #define SDRATTR_TABLE_BORDER_BLTR (SDRATTR_TABLE_FIRST+3) +#define SDRATTR_TABLE_TEXT_ROTATION (SDRATTR_TABLE_FIRST+4) -#define SDRATTR_TABLE_LAST (SDRATTR_TABLE_BORDER_BLTR) +#define SDRATTR_TABLE_LAST (SDRATTR_TABLE_TEXT_ROTATION) #define SDRATTR_END SDRATTR_TABLE_LAST /* 1357 */ /* 1333 V4+++*/ /* 1243 V4+++*/ /*1213*/ /*1085*/ /*1040*/ /*Pool V2: 1123,V1: 1065 */ diff --git a/include/svx/svdoashp.hxx b/include/svx/svdoashp.hxx index 483455aa2d25..dd4d03789c51 100644 --- a/include/svx/svdoashp.hxx +++ b/include/svx/svdoashp.hxx @@ -210,7 +210,7 @@ public: virtual bool AdjustTextFrameWidthAndHeight() override; virtual bool IsAutoGrowHeight() const override; virtual bool IsAutoGrowWidth() const override; - virtual void SetVerticalWriting( bool bVertical ) override; + virtual void SetVerticalWriting(bool bVertical) override; virtual void TakeTextEditArea(Size* pPaperMin, Size* pPaperMax, tools::Rectangle* pViewInit, tools::Rectangle* pViewMin) const override; virtual void EndTextEdit( SdrOutliner& rOutl ) override; virtual void TakeTextAnchorRect( tools::Rectangle& rAnchorRect ) const override; diff --git a/sd/source/ui/func/futext.cxx b/sd/source/ui/func/futext.cxx index 4f9955ceea3a..e22615cb5728 100644 --- a/sd/source/ui/func/futext.cxx +++ b/sd/source/ui/func/futext.cxx @@ -1055,7 +1055,9 @@ void FuText::SetInEditMode(const MouseEvent& rMEvt, bool bQuickDrag) if( pTextObj ) { OutlinerParaObject* pOPO = pTextObj->GetOutlinerParaObject(); - if( ( pOPO && pOPO->IsVertical() ) || (nSlotId == SID_ATTR_CHAR_VERTICAL) || (nSlotId == SID_TEXT_FITTOSIZE_VERTICAL) ) + if( pOPO && pOPO->IsVertical() ) + pOutl->SetVertical( true, pOPO->IsTopToBottom()); + else if (nSlotId == SID_ATTR_CHAR_VERTICAL || nSlotId == SID_TEXT_FITTOSIZE_VERTICAL) pOutl->SetVertical( true ); if( pTextObj->getTextCount() > 1 ) diff --git a/svx/source/svdraw/svdattr.cxx b/svx/source/svdraw/svdattr.cxx index 7a09e8a8c313..427242539cc3 100644 --- a/svx/source/svdraw/svdattr.cxx +++ b/svx/source/svdraw/svdattr.cxx @@ -38,6 +38,7 @@ #include <editeng/adjustitem.hxx> #include <editeng/editdata.hxx> #include <editeng/writingmodeitem.hxx> +#include <editeng/charrotateitem.hxx> #include <i18nutil/unicode.hxx> #include <svl/solar.hrc> #include <tools/bigint.hxx> @@ -320,6 +321,7 @@ SdrItemPool::SdrItemPool( rPoolDefaults[ SDRATTR_TABLE_BORDER_INNER - SDRATTR_START ] = pBoxInfoItem; rPoolDefaults[ SDRATTR_TABLE_BORDER_TLBR - SDRATTR_START ] = new SvxLineItem( SDRATTR_TABLE_BORDER_TLBR ); rPoolDefaults[ SDRATTR_TABLE_BORDER_BLTR - SDRATTR_START ] = new SvxLineItem( SDRATTR_TABLE_BORDER_BLTR ); + rPoolDefaults[ SDRATTR_TABLE_TEXT_ROTATION - SDRATTR_START ] = new SvxTextRotateItem(0, SDRATTR_TABLE_TEXT_ROTATION); // set own ItemInfos mpLocalItemInfos[SDRATTR_SHADOW-SDRATTR_START]._nSID=SID_ATTR_FILL_SHADOW; diff --git a/svx/source/svdraw/svdotext.cxx b/svx/source/svdraw/svdotext.cxx index 6e75fd299131..50522622e646 100644 --- a/svx/source/svdraw/svdotext.cxx +++ b/svx/source/svdraw/svdotext.cxx @@ -1384,7 +1384,7 @@ void SdrTextObj::NbcSetOutlinerParaObjectForText( OutlinerParaObject* pTextObjec if (pText && pText->GetOutlinerParaObject()) { - SvxWritingModeItem aWritingMode(pText->GetOutlinerParaObject()->IsVertical() + SvxWritingModeItem aWritingMode(pText->GetOutlinerParaObject()->IsVertical() && pText->GetOutlinerParaObject()->IsTopToBottom() ? css::text::WritingMode_TB_RL : css::text::WritingMode_LR_TB, SDRATTR_TEXTDIRECTION); @@ -1529,6 +1529,7 @@ bool SdrTextObj::IsVerticalWriting() const void SdrTextObj::SetVerticalWriting(bool bVertical) { OutlinerParaObject* pOutlinerParaObject = GetOutlinerParaObject(); + if( !pOutlinerParaObject && bVertical ) { // we only need to force a outliner para object if the default of @@ -1537,7 +1538,8 @@ void SdrTextObj::SetVerticalWriting(bool bVertical) pOutlinerParaObject = GetOutlinerParaObject(); } - if( pOutlinerParaObject && (pOutlinerParaObject->IsVertical() != bVertical) ) + if (pOutlinerParaObject && + (pOutlinerParaObject->IsVertical() != bVertical)) { // get item settings const SfxItemSet& rSet = GetObjectItemSet(); @@ -1564,14 +1566,14 @@ void SdrTextObj::SetVerticalWriting(bool bVertical) aNewSet.Put(makeSdrTextAutoGrowHeightItem(bAutoGrowWidth)); // Exchange horz and vert adjusts - switch(eVert) + switch (eVert) { case SDRTEXTVERTADJUST_TOP: aNewSet.Put(SdrTextHorzAdjustItem(SDRTEXTHORZADJUST_RIGHT)); break; case SDRTEXTVERTADJUST_CENTER: aNewSet.Put(SdrTextHorzAdjustItem(SDRTEXTHORZADJUST_CENTER)); break; case SDRTEXTVERTADJUST_BOTTOM: aNewSet.Put(SdrTextHorzAdjustItem(SDRTEXTHORZADJUST_LEFT)); break; case SDRTEXTVERTADJUST_BLOCK: aNewSet.Put(SdrTextHorzAdjustItem(SDRTEXTHORZADJUST_BLOCK)); break; } - switch(eHorz) + switch (eHorz) { case SDRTEXTHORZADJUST_LEFT: aNewSet.Put(SdrTextVertAdjustItem(SDRTEXTVERTADJUST_BOTTOM)); break; case SDRTEXTHORZADJUST_CENTER: aNewSet.Put(SdrTextVertAdjustItem(SDRTEXTVERTADJUST_CENTER)); break; @@ -1582,7 +1584,7 @@ void SdrTextObj::SetVerticalWriting(bool bVertical) SetObjectItemSet(aNewSet); pOutlinerParaObject = GetOutlinerParaObject(); - if( pOutlinerParaObject ) + if (pOutlinerParaObject) { // set ParaObject orientation accordingly pOutlinerParaObject->SetVertical(bVertical); @@ -1593,7 +1595,6 @@ void SdrTextObj::SetVerticalWriting(bool bVertical) } } - // transformation interface for StarOfficeAPI. This implements support for // homogeneous 3x3 matrices containing the transformation of the SdrObject. At the // moment it contains a shearX, rotation and translation, but for setting all linear diff --git a/svx/source/svdraw/svdotextdecomposition.cxx b/svx/source/svdraw/svdotextdecomposition.cxx index 926ae34dfc31..a05a428b6798 100644 --- a/svx/source/svdraw/svdotextdecomposition.cxx +++ b/svx/source/svdraw/svdotextdecomposition.cxx @@ -759,6 +759,7 @@ void SdrTextObj::impDecomposeAutoFitTextPrimitive( const OutlinerParaObject* pOutlinerParaObject = rSdrAutofitTextPrimitive.getSdrText()->GetOutlinerParaObject(); OSL_ENSURE(pOutlinerParaObject, "impDecomposeBlockTextPrimitive used with no OutlinerParaObject (!)"); const bool bVerticalWriting(pOutlinerParaObject->IsVertical()); + const bool bTopToBottom(pOutlinerParaObject->IsTopToBottom()); const Size aAnchorTextSize(Size(nAnchorTextWidth, nAnchorTextHeight)); if((rSdrAutofitTextPrimitive.getWordWrap() || IsTextFrame())) @@ -829,8 +830,9 @@ void SdrTextObj::impDecomposeAutoFitTextPrimitive( // translate relative to given primitive to get same rotation and shear // as the master shape we are working on. For vertical, use the top-right // corner - const double fStartInX(bVerticalWriting ? aAdjustTranslate.getX() + aOutlinerScale.getX() : aAdjustTranslate.getX()); - aNewTransformA.translate(fStartInX, aAdjustTranslate.getY()); + const double fStartInX(bVerticalWriting && bTopToBottom ? aAdjustTranslate.getX() + aOutlinerScale.getX() : aAdjustTranslate.getX()); + const double fStartInY(bVerticalWriting && !bTopToBottom ? aAdjustTranslate.getY() + aOutlinerScale.getY() : aAdjustTranslate.getY()); + aNewTransformA.translate(fStartInX, fStartInY); // mirroring. We are now in aAnchorTextRange sizes. When mirroring in X and Y, // move the null point which was top left to bottom right. @@ -922,6 +924,7 @@ void SdrTextObj::impDecomposeBlockTextPrimitive( const sal_uInt32 nAnchorTextWidth(FRound(aAnchorTextRange.getWidth() + 1L)); const sal_uInt32 nAnchorTextHeight(FRound(aAnchorTextRange.getHeight() + 1L)); const bool bVerticalWriting(rSdrBlockTextPrimitive.getOutlinerParaObject().IsVertical()); + const bool bTopToBottom(rSdrBlockTextPrimitive.getOutlinerParaObject().IsTopToBottom()); const Size aAnchorTextSize(Size(nAnchorTextWidth, nAnchorTextHeight)); if(bIsCell) @@ -1082,8 +1085,9 @@ void SdrTextObj::impDecomposeBlockTextPrimitive( // Translate relative to given primitive to get same rotation and shear // as the master shape we are working on. For vertical, use the top-right // corner - const double fStartInX(bVerticalWriting ? aAdjustTranslate.getX() + aOutlinerScale.getX() : aAdjustTranslate.getX()); - const basegfx::B2DTuple aAdjOffset(fStartInX, aAdjustTranslate.getY()); + const double fStartInX(bVerticalWriting && bTopToBottom ? aAdjustTranslate.getX() + aOutlinerScale.getX() : aAdjustTranslate.getX()); + const double fStartInY(bVerticalWriting && !bTopToBottom ? aAdjustTranslate.getY() + aOutlinerScale.getY() : aAdjustTranslate.getY()); + const basegfx::B2DTuple aAdjOffset(fStartInX, fStartInY); basegfx::B2DHomMatrix aNewTransformA(basegfx::tools::createTranslateB2DHomMatrix(aAdjOffset.getX(), aAdjOffset.getY())); // mirroring. We are now in aAnchorTextRange sizes. When mirroring in X and Y, @@ -1162,10 +1166,14 @@ void SdrTextObj::impDecomposeStretchTextPrimitive( // needs to translate the text initially around object width to orient // it relative to the topper right instead of the topper left const bool bVertical(rSdrStretchTextPrimitive.getOutlinerParaObject().IsVertical()); + const bool bTopToBottom(rSdrStretchTextPrimitive.getOutlinerParaObject().IsTopToBottom()); if(bVertical) { - aNewTransformA.translate(aScale.getX(), 0.0); + if(bTopToBottom) + aNewTransformA.translate(aScale.getX(), 0.0); + else + aNewTransformA.translate(0.0, aScale.getY()); } // calculate global char stretching scale parameters. Use non-mirrored sizes @@ -1517,6 +1525,7 @@ void SdrTextObj::impDecomposeChainedTextPrimitive( OSL_ENSURE(pOutlinerParaObject, "impDecomposeBlockTextPrimitive used with no OutlinerParaObject (!)"); const bool bVerticalWriting(pOutlinerParaObject->IsVertical()); + const bool bTopToBottom(pOutlinerParaObject->IsTopToBottom()); const Size aAnchorTextSize(Size(nAnchorTextWidth, nAnchorTextHeight)); if(IsTextFrame()) @@ -1593,8 +1602,9 @@ void SdrTextObj::impDecomposeChainedTextPrimitive( // translate relative to given primitive to get same rotation and shear // as the master shape we are working on. For vertical, use the top-right // corner - const double fStartInX(bVerticalWriting ? aAdjustTranslate.getX() + aOutlinerScale.getX() : aAdjustTranslate.getX()); - aNewTransformA.translate(fStartInX, aAdjustTranslate.getY()); + const double fStartInX(bVerticalWriting && bTopToBottom ? aAdjustTranslate.getX() + aOutlinerScale.getX() : aAdjustTranslate.getX()); + const double fStartInY(bVerticalWriting && !bTopToBottom ? aAdjustTranslate.getY() + aOutlinerScale.getY() : aAdjustTranslate.getY()); + aNewTransformA.translate(fStartInX, fStartInY); // mirroring. We are now in aAnchorTextRange sizes. When mirroring in X and Y, // move the null point which was top left to bottom right. diff --git a/svx/source/table/cell.cxx b/svx/source/table/cell.cxx index 41601c98be83..814e69ce3790 100644 --- a/svx/source/table/cell.cxx +++ b/svx/source/table/cell.cxx @@ -51,6 +51,7 @@ #include "svx/unoshape.hxx" #include "editeng/editobj.hxx" #include "editeng/boxitem.hxx" +#include <editeng/charrotateitem.hxx> #include "svx/xflbstit.hxx" #include "svx/xflbmtit.hxx" #include <svx/svdpool.hxx> @@ -284,6 +285,7 @@ namespace sdr OutlinerParaObject* pTemp = pOutliner->CreateParaObject(0, nParaCount); pOutliner->Clear(); + pTemp->SetVertical(pParaObj->IsVertical(), pParaObj->IsTopToBottom()); mxCell->SetOutlinerParaObject(pTemp); } @@ -307,8 +309,7 @@ namespace sdr bool bVertical(css::text::WritingMode_TB_RL == static_cast<const SvxWritingModeItem*>(pNewItem)->GetValue()); sdr::table::SdrTableObj& rObj = static_cast<sdr::table::SdrTableObj&>(GetSdrObject()); - if( rObj.IsVerticalWriting() != bVertical ) - rObj.SetVerticalWriting(bVertical); + rObj.SetVerticalWriting(bVertical); // Set a cell vertical property OutlinerParaObject* pParaObj = mxCell->GetEditOutlinerParaObject(); @@ -327,6 +328,50 @@ namespace sdr } } + if (pNewItem && (SDRATTR_TABLE_TEXT_ROTATION == nWhich)) + { + const SvxTextRotateItem* pRotateItem = static_cast<const SvxTextRotateItem*>(pNewItem); + + // Set a cell vertical property + OutlinerParaObject* pParaObj = mxCell->GetEditOutlinerParaObject(); + + const bool bOwnParaObj = pParaObj != nullptr; + + if (pParaObj == nullptr) + pParaObj = mxCell->GetOutlinerParaObject(); + + if (pParaObj) + { + pParaObj->SetVertical(pRotateItem->IsVertical(), pRotateItem->IsTopToBottom()); + + if (bOwnParaObj) + delete pParaObj; + } + + // Change autogrow direction + SdrTextObj& rObj = static_cast<SdrTextObj&>(GetSdrObject()); + + // rescue object size + tools::Rectangle aObjectRect = rObj.GetSnapRect(); + + const SfxItemSet& rSet = rObj.GetObjectItemSet(); + bool bAutoGrowWidth = static_cast<const SdrOnOffItem&>(rSet.Get(SDRATTR_TEXT_AUTOGROWWIDTH)).GetValue(); + bool bAutoGrowHeight = static_cast<const SdrOnOffItem&>(rSet.Get(SDRATTR_TEXT_AUTOGROWHEIGHT)).GetValue(); + + // prepare ItemSet to set exchanged width and height items + SfxItemSet aNewSet(*rSet.GetPool(), + SDRATTR_TEXT_AUTOGROWHEIGHT, SDRATTR_TEXT_AUTOGROWHEIGHT, + 0, 0); + + aNewSet.Put(rSet); + aNewSet.Put(makeSdrTextAutoGrowWidthItem(bAutoGrowHeight)); + aNewSet.Put(makeSdrTextAutoGrowHeightItem(bAutoGrowWidth)); + rObj.SetObjectItemSet(aNewSet); + + // restore object size + rObj.SetSnapRect(aObjectRect); + } + // call parent AttributeProperties::ItemChange( nWhich, pNewItem ); } diff --git a/svx/source/table/svdotable.cxx b/svx/source/table/svdotable.cxx index 7aea17aebfdf..0b0596bae078 100644 --- a/svx/source/table/svdotable.cxx +++ b/svx/source/table/svdotable.cxx @@ -1943,9 +1943,9 @@ bool SdrTableObj::IsVerticalWriting() const } -void SdrTableObj::SetVerticalWriting(bool bVertical ) +void SdrTableObj::SetVerticalWriting(bool bVertical) { - if( bVertical != IsVerticalWriting() ) + if(bVertical != IsVerticalWriting() ) { SvxWritingModeItem aModeItem( css::text::WritingMode_LR_TB, SDRATTR_TEXTDIRECTION ); SetObjectItem( aModeItem ); diff --git a/svx/source/unodraw/unoshtxt.cxx b/svx/source/unodraw/unoshtxt.cxx index cb5b73836645..0d688e55bf3c 100644 --- a/svx/source/unodraw/unoshtxt.cxx +++ b/svx/source/unodraw/unoshtxt.cxx @@ -635,7 +635,7 @@ SvxTextForwarder* SvxTextEditSourceImpl::GetBackgroundTextForwarder() mpOutliner->SetStyleSheet( 0, pStyleSheet ); if( bVertical ) - mpOutliner->SetVertical( true ); + mpOutliner->SetVertical( true, pOutlinerParaObject->IsTopToBottom()); } // maybe we have to set the border attributes |