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,94 +1112,50 @@ void SvxRuler::UpdateTabs() ...@@ -1110,94 +1112,50 @@ 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);
long lTabStartLogic = (mxRulerImpl->bIsTabsRelativeToIndent ? lParaIndent : nLeftFrameMargin)
+ lAppNullOffset;
if (bRTL)
{
lTabStartLogic = lParaIndent + lRightMargin - lTabStartLogic;
}
long lLastTabOffsetLogic = 0;
for(j = 0; j < mxTabStopItem->Count(); ++j) for(j = 0; j < mxTabStopItem->Count(); ++j)
{ {
const SvxTabStop* pTab = &mxTabStopItem->At(j); const SvxTabStop* pTab = &mxTabStopItem->At(j);
if (mxRulerImpl->bIsTabsRelativeToIndent) lLastTabOffsetLogic = pTab->GetTabPos();
{ long lPos = lTabStartLogic + (bRTL ? -lLastTabOffsetLogic : lLastTabOffsetLogic);
long nTabPosition = ConvertHPosPixel(lParaIndent + pTab->GetTabPos() + lAppNullOffset); mpTabs[nTabCount + TAB_GAP].nPos = ConvertHPosPixel(lPos);
mpTabs[nTabCount + TAB_GAP].nPos = nTabPosition;
}
else
{
long nTabPosition = ConvertHPosPixel(0 + pTab->GetTabPos() + lAppNullOffset);
mpTabs[nTabCount + TAB_GAP].nPos = nTabPosition;
}
if(bRTL)
{
mpTabs[nTabCount + TAB_GAP].nPos = lParaIndentPix + lRightPixMargin - mpTabs[nTabCount + TAB_GAP].nPos;
}
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
else
{
sal_Int32 aFirst = 0;
for(j = 0; j < nDefTabBuf; ++j)
{ {
if( j == 0 ) mpTabs[nTabCount + TAB_GAP].nPos =
{ ConvertHPosPixel(lTabStartLogic + lLastTabOffsetLogic);
//set the first default tab stop if (mpTabs[nTabCount + TAB_GAP].nPos >= lRightIndent)
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
{
//simply add the default distance to the last position
mpTabs[nTabCount + TAB_GAP].nPos = aFirst + ConvertHPosPixel(j * lDefTabDist);
}
if(mpTabs[nTabCount + TAB_GAP].nPos >= lRightIndent)
break; break;
mpTabs[nTabCount + TAB_GAP].nStyle = RULER_TAB_DEFAULT;
++nTabCount;
} }
mpTabs[nTabCount + TAB_GAP].nStyle = RULER_TAB_DEFAULT;
++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