Kaydet (Commit) b76abe2d authored tarafından Mike Kaganski's avatar Mike Kaganski Kaydeden (comit) Oliver Specht

tdf#95846: fix not-relative-to-indent tab stop positions

Also minimize rounding errors in tab stop pixel positions.

Change-Id: I929d8ca0cd4fc665ea66bf47a7e3b5e47dc8e7f2
Reviewed-on: https://gerrit.libreoffice.org/20762Tested-by: 's avatarJenkins <ci@libreoffice.org>
Reviewed-by: 's avatarOliver Specht <oliver.specht@cib.de>
üst 4dc0ba63
...@@ -135,6 +135,7 @@ struct SvxRuler_Impl { ...@@ -135,6 +135,7 @@ struct SvxRuler_Impl {
bool bIsTableRows : 1; // mxColumnItem contains table rows instead of columns bool bIsTableRows : 1; // mxColumnItem contains table rows instead of columns
//#i24363# tab stops relative to indent //#i24363# tab stops relative to indent
bool bIsTabsRelativeToIndent : 1; // Tab stops relative to paragraph indent? bool bIsTabsRelativeToIndent : 1; // Tab stops relative to paragraph indent?
// false means relative to SvxRuler::GetLeftFrameMargin()
SvxRuler_Impl() : SvxRuler_Impl() :
pPercBuf(nullptr), pBlockBuf(nullptr), nPercSize(0), nTotalDist(0), pPercBuf(nullptr), pBlockBuf(nullptr), nPercSize(0), nTotalDist(0),
...@@ -1077,13 +1078,14 @@ void SvxRuler::UpdateTabs() ...@@ -1077,13 +1078,14 @@ void SvxRuler::UpdateTabs()
// Distance last Tab <-> Right paragraph margin / DefaultTabDist // Distance last Tab <-> Right paragraph margin / DefaultTabDist
bool bRTL = mxRulerImpl->pTextRTLItem && mxRulerImpl->pTextRTLItem->GetValue(); bool bRTL = mxRulerImpl->pTextRTLItem && mxRulerImpl->pTextRTLItem->GetValue();
long nLeftFrameMargin = GetLeftFrameMargin(); const long nLeftFrameMargin = GetLeftFrameMargin();
long nRightFrameMargin = GetRightFrameMargin(); const long nRightFrameMargin = GetRightFrameMargin();
//#i24363# tab stops relative to indent //#i24363# tab stops relative to indent
const long nParaItemTxtLeft = mxParaItem->GetTextLeft(); const long nParaItemTxtLeft = mxParaItem->GetTextLeft();
const long lParaIndent = nLeftFrameMargin + nParaItemTxtLeft; const long lParaIndent = nLeftFrameMargin + nParaItemTxtLeft;
const long lRightMargin = nRightFrameMargin - nParaItemTxtLeft;
const long lLastTab = mxTabStopItem->Count() const long lLastTab = mxTabStopItem->Count()
? ConvertHPosPixel(mxTabStopItem->At(mxTabStopItem->Count() - 1).GetTabPos()) ? ConvertHPosPixel(mxTabStopItem->At(mxTabStopItem->Count() - 1).GetTabPos())
...@@ -1110,95 +1112,51 @@ void SvxRuler::UpdateTabs() ...@@ -1110,95 +1112,51 @@ void SvxRuler::UpdateTabs()
nTabCount = 0; nTabCount = 0;
sal_uInt16 j; sal_uInt16 j;
//#i24363# tab stops relative to indent
const long lRightPixMargin = ConvertSizePixel(nRightFrameMargin - nParaItemTxtLeft );
const long lParaIndentPix = ConvertSizePixel(lParaIndent); const long lParaIndentPix = ConvertSizePixel(lParaIndent);
for(j = 0; j < mxTabStopItem->Count(); ++j) long lTabStartLogic = (mxRulerImpl->bIsTabsRelativeToIndent ? lParaIndent : nLeftFrameMargin)
{ + lAppNullOffset;
const SvxTabStop* pTab = &mxTabStopItem->At(j); if (bRTL)
if (mxRulerImpl->bIsTabsRelativeToIndent)
{
long nTabPosition = ConvertHPosPixel(lParaIndent + pTab->GetTabPos() + lAppNullOffset);
mpTabs[nTabCount + TAB_GAP].nPos = nTabPosition;
}
else
{ {
long nTabPosition = ConvertHPosPixel(0 + pTab->GetTabPos() + lAppNullOffset); lTabStartLogic = lParaIndent + lRightMargin - lTabStartLogic;
mpTabs[nTabCount + TAB_GAP].nPos = nTabPosition;
} }
long lLastTabOffsetLogic = 0;
if(bRTL) for(j = 0; j < mxTabStopItem->Count(); ++j)
{ {
mpTabs[nTabCount + TAB_GAP].nPos = lParaIndentPix + lRightPixMargin - mpTabs[nTabCount + TAB_GAP].nPos; const SvxTabStop* pTab = &mxTabStopItem->At(j);
} lLastTabOffsetLogic = pTab->GetTabPos();
long lPos = lTabStartLogic + (bRTL ? -lLastTabOffsetLogic : lLastTabOffsetLogic);
mpTabs[nTabCount + TAB_GAP].nPos = ConvertHPosPixel(lPos);
mpTabs[nTabCount + TAB_GAP].nStyle = ToSvTab_Impl(pTab->GetAdjustment()); mpTabs[nTabCount + TAB_GAP].nStyle = ToSvTab_Impl(pTab->GetAdjustment());
++nTabCount; ++nTabCount;
} }
if(!mxTabStopItem->Count()) // Adjust to previous-to-first default tab stop
mpTabs[0].nPos = bRTL ? lRightPixMargin : lParaIndentPix; lLastTabOffsetLogic -= lLastTabOffsetLogic % lDefTabDist;
// fill the rest with default Tabs // fill the rest with default Tabs
if(bRTL) for (j = 0; j < nDefTabBuf; ++j)
{ {
sal_Int32 aFirst = mpTabs[nTabCount].nPos; //simply add the default distance to the last position
for(j = 0; j < nDefTabBuf; ++j) lLastTabOffsetLogic += lDefTabDist;
if (bRTL)
{ {
mpTabs[nTabCount + TAB_GAP].nPos = mpTabs[nTabCount + TAB_GAP].nPos =
aFirst - ConvertHPosPixel(j * lDefTabDist); ConvertHPosPixel(lTabStartLogic - lLastTabOffsetLogic);
if (mpTabs[nTabCount + TAB_GAP].nPos <= lParaIndentPix)
if(j == 0 )
{
mpTabs[nTabCount + TAB_GAP].nPos -=
((mpTabs[nTabCount + TAB_GAP].nPos - lRightPixMargin)
% nDefTabDist );
}
if(mpTabs[nTabCount + TAB_GAP].nPos <= lParaIndentPix)
break; break;
mpTabs[nTabCount + TAB_GAP].nStyle = RULER_TAB_DEFAULT;
++nTabCount;
}
}
else
{
sal_Int32 aFirst = 0;
for(j = 0; j < nDefTabBuf; ++j)
{
if( j == 0 )
{
//set the first default tab stop
if(mxRulerImpl->bIsTabsRelativeToIndent)
{
mpTabs[nTabCount + TAB_GAP].nPos = (mpTabs[nTabCount].nPos + nDefTabDist);
mpTabs[nTabCount + TAB_GAP].nPos -=
(mpTabs[nTabCount + TAB_GAP].nPos - lParaIndentPix) % nDefTabDist;
aFirst = mpTabs[nTabCount + TAB_GAP].nPos;
}
else
{
if( mpTabs[nTabCount].nPos < 0 )
aFirst = ( mpTabs[nTabCount].nPos / nDefTabDist ) * nDefTabDist;
else
aFirst = ( mpTabs[nTabCount].nPos / nDefTabDist + 1 ) * nDefTabDist;
mpTabs[nTabCount + TAB_GAP].nPos = aFirst;
}
} }
else else
{ {
//simply add the default distance to the last position mpTabs[nTabCount + TAB_GAP].nPos =
ConvertHPosPixel(lTabStartLogic + lLastTabOffsetLogic);
mpTabs[nTabCount + TAB_GAP].nPos = aFirst + ConvertHPosPixel(j * lDefTabDist); if (mpTabs[nTabCount + TAB_GAP].nPos >= lRightIndent)
break;
} }
if(mpTabs[nTabCount + TAB_GAP].nPos >= lRightIndent)
break;
mpTabs[nTabCount + TAB_GAP].nStyle = RULER_TAB_DEFAULT; mpTabs[nTabCount + TAB_GAP].nStyle = RULER_TAB_DEFAULT;
++nTabCount; ++nTabCount;
} }
}
SetTabs(nTabCount, &mpTabs[0] + TAB_GAP); SetTabs(nTabCount, &mpTabs[0] + TAB_GAP);
DBG_ASSERT(nTabCount + TAB_GAP <= nTabBufSize, "BufferSize too small"); DBG_ASSERT(nTabCount + TAB_GAP <= nTabBufSize, "BufferSize too small");
} }
...@@ -2268,7 +2226,8 @@ void SvxRuler::ApplyTabs() ...@@ -2268,7 +2226,8 @@ void SvxRuler::ApplyTabs()
{ {
//#i24363# tab stops relative to indent //#i24363# tab stops relative to indent
const long nTmpLeftIndent = mxRulerImpl->bIsTabsRelativeToIndent ? const long nTmpLeftIndent = mxRulerImpl->bIsTabsRelativeToIndent ?
GetLeftIndent() : 0; GetLeftIndent() :
ConvertHPosPixel( GetLeftFrameMargin() + lAppNullOffset );
long nNewPosition = ConvertHPosLogic(mpTabs[nCoreIdx + TAB_GAP].nPos - nTmpLeftIndent); long nNewPosition = ConvertHPosLogic(mpTabs[nCoreIdx + TAB_GAP].nPos - nTmpLeftIndent);
aTabStop.GetTabPos() = PixelHAdjust(nNewPosition - lAppNullOffset, aTabStop.GetTabPos()); aTabStop.GetTabPos() = PixelHAdjust(nNewPosition - lAppNullOffset, aTabStop.GetTabPos());
...@@ -2601,7 +2560,7 @@ void SvxRuler::Click() ...@@ -2601,7 +2560,7 @@ void SvxRuler::Click()
nTabPos = lPos - nTabPos = lPos -
( mxRulerImpl->bIsTabsRelativeToIndent ? ( mxRulerImpl->bIsTabsRelativeToIndent ?
GetLeftIndent() : GetLeftIndent() :
0 ); ConvertHPosPixel( GetLeftFrameMargin() + lAppNullOffset ));
SvxTabStop aTabStop(ConvertHPosLogic(nTabPos), SvxTabStop aTabStop(ConvertHPosLogic(nTabPos),
ToAttrTab_Impl(nDefTabType)); ToAttrTab_Impl(nDefTabType));
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment