ruler: RTL fixes for indents in tables and columns
Change-Id: I6c0a819e4a294fcf50c96a51bb9eea3ddef84c57
diff --git a/svx/source/dialog/svxruler.cxx b/svx/source/dialog/svxruler.cxx
index f4d0929..79338c3 100644
--- a/svx/source/dialog/svxruler.cxx
+++ b/svx/source/dialog/svxruler.cxx
@@ -1326,11 +1326,11 @@ inline long SvxRuler::GetRightMax() const
long SvxRuler::GetRightFrameMargin() const
{
/* Get right frame margin (in logical units) */
if(mpColumnItem.get())
if (mpColumnItem.get())
{
if(!IsActLastColumn( sal_True ))
if (!IsActLastColumn(true))
{
return (*mpColumnItem.get())[GetActRightColumn( sal_True )].nEnd;
return mpColumnItem->At(GetActRightColumn(true)).nEnd;
}
}
@@ -1405,10 +1405,11 @@ void SvxRuler::DragMargin1()
AdjustMargin1(aDragPosition);
}
void SvxRuler::AdjustMargin1(long lDiff)
void SvxRuler::AdjustMargin1(long lInputDiff)
{
const long nOld = bAppSetNullOffset? GetMargin1(): GetNullOffset();
const long lDragPos = lDiff;
const long lDragPos = lInputDiff;
sal_Bool bProtectColumns =
mpRulerImpl->aProtectItem.IsSizeProtected() ||
mpRulerImpl->aProtectItem.IsPosProtected();
@@ -1418,35 +1419,35 @@ void SvxRuler::AdjustMargin1(long lDiff)
if(!bAppSetNullOffset)
{
long _lDiff = lDragPos;
SetNullOffset(nOld + _lDiff);
long lDiff = lDragPos;
SetNullOffset(nOld + lDiff);
if (!mpColumnItem.get() || !(nDragType & DRAG_OBJECT_SIZE_LINEAR))
{
SetMargin2( GetMargin2() - _lDiff, nMarginStyle );
SetMargin2( GetMargin2() - lDiff, nMarginStyle );
if (!mpColumnItem.get() && !mpObjectItem.get() && mpParaItem.get())
{
// Right indent of the old position
mpIndents[INDENT_RIGHT_MARGIN].nPos -= _lDiff;
mpIndents[INDENT_RIGHT_MARGIN].nPos -= lDiff;
SetIndents(INDENT_COUNT, mpIndents.get() + INDENT_GAP);
}
if(mpObjectItem.get())
{
mpObjectBorders[GetObjectBordersOff(0)].nPos -= _lDiff;
mpObjectBorders[GetObjectBordersOff(1)].nPos -= _lDiff;
mpObjectBorders[GetObjectBordersOff(0)].nPos -= lDiff;
mpObjectBorders[GetObjectBordersOff(1)].nPos -= lDiff;
SetBorders(2, mpObjectBorders.get() + GetObjectBordersOff(0));
}
if(mpColumnItem.get())
{
for(sal_uInt16 i = 0; i < mpColumnItem->Count()-1; ++i)
mpBorders[i].nPos -= _lDiff;
mpBorders[i].nPos -= lDiff;
SetBorders(mpColumnItem->Count()-1, mpBorders.get());
if(mpColumnItem->IsFirstAct())
{
// Right indent of the old position
if(mpParaItem.get())
{
mpIndents[INDENT_RIGHT_MARGIN].nPos -= _lDiff;
mpIndents[INDENT_RIGHT_MARGIN].nPos -= lDiff;
SetIndents(INDENT_COUNT, mpIndents.get() + INDENT_GAP);
}
}
@@ -1454,16 +1455,16 @@ void SvxRuler::AdjustMargin1(long lDiff)
{
if(mpParaItem.get())
{
mpIndents[INDENT_FIRST_LINE].nPos -= _lDiff;
mpIndents[INDENT_LEFT_MARGIN].nPos -= _lDiff;
mpIndents[INDENT_RIGHT_MARGIN].nPos -= _lDiff;
mpIndents[INDENT_FIRST_LINE].nPos -= lDiff;
mpIndents[INDENT_LEFT_MARGIN].nPos -= lDiff;
mpIndents[INDENT_RIGHT_MARGIN].nPos -= lDiff;
SetIndents(INDENT_COUNT, mpIndents.get() + INDENT_GAP);
}
}
if(mpTabStopItem.get() && (nDragType & DRAG_OBJECT_SIZE_PROPORTIONAL)
&&!IsActFirstColumn())
{
ModifyTabs_Impl(nTabCount+TAB_GAP, mpTabs.get(), - _lDiff);
ModifyTabs_Impl(nTabCount+TAB_GAP, mpTabs.get(), - lDiff);
SetTabs(nTabCount, mpTabs.get() + TAB_GAP);
}
}
@@ -1471,31 +1472,31 @@ void SvxRuler::AdjustMargin1(long lDiff)
}
else
{
long _lDiff = lDragPos - nOld;
SetMargin1(nOld + _lDiff, nMarginStyle );
long lDiff = lDragPos - nOld;
SetMargin1(nOld + lDiff, nMarginStyle);
if (!mpColumnItem.get() || !(nDragType & (DRAG_OBJECT_SIZE_LINEAR | DRAG_OBJECT_SIZE_PROPORTIONAL)))
{
if (!mpColumnItem.get() && !mpObjectItem.get() && mpParaItem.get())
{
// Left indent of the old position
mpIndents[INDENT_FIRST_LINE].nPos += _lDiff;
mpIndents[INDENT_LEFT_MARGIN].nPos += _lDiff;
mpIndents[INDENT_FIRST_LINE].nPos += lDiff;
mpIndents[INDENT_LEFT_MARGIN].nPos += lDiff;
SetIndents(INDENT_COUNT, mpIndents.get() + INDENT_GAP);
}
if (mpColumnItem.get())
{
for(sal_uInt16 i = 0; i < mpColumnItem->Count()-1; ++i)
mpBorders[i].nPos += _lDiff;
SetBorders(mpColumnItem->Count()-1, mpBorders.get());
for(sal_uInt16 i = 0; i < mpColumnItem->Count() - 1; ++i)
mpBorders[i].nPos += lDiff;
SetBorders(mpColumnItem->Count() - 1, mpBorders.get());
if (mpColumnItem->IsFirstAct())
{
// Left indent of the old position
if(mpParaItem.get())
{
mpIndents[INDENT_FIRST_LINE].nPos += _lDiff;
mpIndents[INDENT_LEFT_MARGIN].nPos += _lDiff;
mpIndents[INDENT_FIRST_LINE].nPos += lDiff;
mpIndents[INDENT_LEFT_MARGIN].nPos += lDiff;
SetIndents(INDENT_COUNT, mpIndents.get() + INDENT_GAP);
}
}
@@ -1503,16 +1504,16 @@ void SvxRuler::AdjustMargin1(long lDiff)
{
if(mpParaItem.get())
{
mpIndents[INDENT_FIRST_LINE].nPos += _lDiff;
mpIndents[INDENT_LEFT_MARGIN].nPos += _lDiff;
mpIndents[INDENT_RIGHT_MARGIN].nPos += _lDiff;
mpIndents[INDENT_FIRST_LINE].nPos += lDiff;
mpIndents[INDENT_LEFT_MARGIN].nPos += lDiff;
mpIndents[INDENT_RIGHT_MARGIN].nPos += lDiff;
SetIndents(INDENT_COUNT, mpIndents.get() + INDENT_GAP);
}
}
}
if(mpTabStopItem.get())
{
ModifyTabs_Impl(nTabCount+TAB_GAP, mpTabs.get(), _lDiff);
ModifyTabs_Impl(nTabCount+TAB_GAP, mpTabs.get(), lDiff);
SetTabs(nTabCount, mpTabs.get() + TAB_GAP);
}
}
@@ -1562,10 +1563,12 @@ void SvxRuler::DragIndents()
long aDragPosition = NEG_FLAG ? GetDragPos() : GetCorrectedDragPos();
const sal_uInt16 nIndex = GetDragAryPos() + INDENT_GAP;
bool bRTL = mpRulerImpl->pTextRTLItem && mpRulerImpl->pTextRTLItem->GetValue();
if(nIndex == INDENT_RIGHT_MARGIN)
aDragPosition = MakePositionSticky(aDragPosition, GetRightFrameMargin());
aDragPosition = MakePositionSticky(aDragPosition, bRTL ? GetLeftFrameMargin() : GetRightFrameMargin());
else
aDragPosition = MakePositionSticky(aDragPosition, GetLeftFrameMargin());
aDragPosition = MakePositionSticky(aDragPosition, bRTL ? GetRightFrameMargin() : GetLeftFrameMargin());
const long lDiff = mpIndents[nIndex].nPos - aDragPosition;
@@ -1987,7 +1990,7 @@ void SvxRuler::DragObjectBorder()
void SvxRuler::ApplyMargins()
{
/* Applying margins; changed by dragging. */
const SfxPoolItem *pItem = 0;
const SfxPoolItem* pItem = NULL;
sal_uInt16 nId = SID_ATTR_LONG_LRSPACE;
if(bHorz)
@@ -2062,135 +2065,105 @@ void SvxRuler::ApplyMargins()
long SvxRuler::RoundToCurrentMapMode(long lValue) const
{
RulerUnitData aUnitData = GetCurrentRulerUnit();
long lNewValue = pEditWin->LogicToLogic(Size(lValue, 0), pEditWin->GetMapMode(), GetCurrentMapMode()).Width();
double aRoundingFactor = aUnitData.nTickUnit / aUnitData.nTick1;
long lNewValue = pEditWin->LogicToLogic(Size(lValue, 0), pEditWin->GetMapMode(), GetCurrentMapMode()).Width();
lNewValue = (std::round(lNewValue / (double) aUnitData.nTickUnit * aRoundingFactor) / aRoundingFactor) * aUnitData.nTickUnit;
return pEditWin->LogicToLogic(Size(lNewValue, 0), GetCurrentMapMode(), pEditWin->GetMapMode()).Width();
}
void SvxRuler::ApplyIndents()
{
long nLeftFrameMargin = GetLeftFrameMargin();
long nRightFrameMargin = GetRightFrameMargin();
/* Applying paragraph settings; changed by dragging. */
long nLeftFrameMargin = GetLeftFrameMargin();
bool bRTL = mpRulerImpl->pTextRTLItem && mpRulerImpl->pTextRTLItem->GetValue();
/* Applying paragraph settings; changed by dragging. */
long nNewTxtLeft;
if(mpColumnItem.get() && !IsActFirstColumn(sal_True))
{
long nLeftCol = GetActLeftColumn(sal_True);
nNewTxtLeft =
PixelHAdjust(
ConvertHPosLogic(mpIndents[INDENT_LEFT_MARGIN].nPos) -
(ConvertHPosLogic(mpBorders[nLeftCol].nPos) +
ConvertHPosLogic(mpBorders[nLeftCol].nWidth)) -
lAppNullOffset,
mpParaItem->GetTxtLeft());
}
else
{
nNewTxtLeft = PixelHAdjust(
ConvertHPosLogic(mpIndents[INDENT_LEFT_MARGIN].nPos),
mpParaItem->GetTxtLeft());
}
if (mbSnapping)
nNewTxtLeft = RoundToCurrentMapMode(nNewTxtLeft);
long nNewFirstLineOffset;
long nNewRight;
if(bRTL)
long nFirstLine = ConvertPosLogic(mpIndents[INDENT_FIRST_LINE].nPos);
long nLeftMargin = ConvertPosLogic(mpIndents[INDENT_LEFT_MARGIN].nPos);
long nRightMargin = ConvertPosLogic(mpIndents[INDENT_RIGHT_MARGIN].nPos);
if(mpColumnItem.get() && ((bRTL && !IsActLastColumn(sal_True)) || (!bRTL && !IsActFirstColumn(sal_True))))
{
nNewFirstLineOffset = PixelHAdjust(
nRightFrameMargin -
ConvertHPosLogic(mpIndents[INDENT_FIRST_LINE].nPos ) -
lAppNullOffset,
mpParaItem->GetTxtFirstLineOfst());
if(bRTL)
{
long nRightColumn = GetActRightColumn(sal_True);
long nRightBorder = ConvertPosLogic(mpBorders[nRightColumn].nPos);
nNewTxtLeft = nRightBorder - nLeftMargin - lAppNullOffset;
}
else
{
long nLeftColumn = GetActLeftColumn(sal_True);
long nLeftBorder = ConvertPosLogic(mpBorders[nLeftColumn].nPos + mpBorders[nLeftColumn].nWidth);
nNewTxtLeft = nLeftMargin - nLeftBorder - lAppNullOffset;
}
}
else
{
nNewFirstLineOffset = PixelHAdjust(
ConvertHPosLogic(mpIndents[INDENT_FIRST_LINE].nPos) -
ConvertHPosLogic(mpIndents[INDENT_LEFT_MARGIN].nPos) -
lAppNullOffset,
mpParaItem->GetTxtFirstLineOfst());
if(bRTL)
{
long nRightBorder = ConvertPosLogic(GetMargin2());
nNewTxtLeft = nRightBorder - nLeftMargin - lAppNullOffset;
}
else
{
long nLeftBorder = ConvertPosLogic(GetMargin1());
nNewTxtLeft = nLeftBorder + nLeftMargin - nLeftFrameMargin - lAppNullOffset;
}
}
// If the new TxtLeft is smaller than the old FirstLineIndent, then the
// difference is lost and the paragraph is in total indented too far,
// so first set the FirstLineOffset, then the TxtLeft
if(bRTL)
nNewFirstLineOffset = nLeftMargin - nFirstLine - lAppNullOffset;
else
nNewFirstLineOffset = nFirstLine - nLeftMargin - lAppNullOffset;
if(mpColumnItem.get() && ((!bRTL && !IsActLastColumn(sal_True)) || (bRTL && !IsActFirstColumn(sal_True))))
{
nNewTxtLeft = nRightFrameMargin - nNewTxtLeft - nLeftFrameMargin;
nNewFirstLineOffset -= nNewTxtLeft;
if(mpParaBorderItem.get())
if(bRTL)
{
nNewTxtLeft += mpParaBorderItem->GetLeft() + mpParaBorderItem->GetRight();
nNewFirstLineOffset -= mpParaBorderItem->GetRight();
long nLeftColumn = GetActLeftColumn(sal_True);
long nLeftBorder = ConvertPosLogic(mpBorders[nLeftColumn].nPos + mpBorders[nLeftColumn].nWidth);
nNewRight = nRightMargin - nLeftBorder - lAppNullOffset;
}
else
{
long nRightColumn = GetActRightColumn(sal_True);
long nRightBorder = ConvertPosLogic(mpBorders[nRightColumn].nPos);
nNewRight = nRightBorder - nRightMargin - lAppNullOffset;
}
}
else
{
if(bRTL)
{
long nLeftBorder = ConvertPosLogic(GetMargin1());
nNewRight = nLeftBorder + nRightMargin - nLeftFrameMargin - lAppNullOffset;
}
else
{
long nRightBorder = ConvertPosLogic(GetMargin2());
nNewRight = nRightBorder - nRightMargin - lAppNullOffset;
}
}
if (mbSnapping)
{
nNewTxtLeft = RoundToCurrentMapMode(nNewTxtLeft);
nNewFirstLineOffset = RoundToCurrentMapMode(nNewFirstLineOffset);
nNewRight = RoundToCurrentMapMode(nNewRight);
}
mpParaItem->SetTxtFirstLineOfst(sal::static_int_cast< short >(nNewFirstLineOffset));
mpParaItem->SetTxtFirstLineOfst(sal::static_int_cast<short>(nNewFirstLineOffset));
mpParaItem->SetTxtLeft(nNewTxtLeft);
mpParaItem->SetRight(nNewRight);
long nRight;
if(mpColumnItem.get() && ((!bRTL && !IsActLastColumn( sal_True )) || (bRTL && !IsActFirstColumn())))
{
if(bRTL)
{
long nActBorder = ConvertHPosLogic(mpBorders[GetActLeftColumn(sal_True)].nPos);
long nRightMargin = ConvertHPosLogic(mpIndents[INDENT_RIGHT_MARGIN].nPos);
long nConvert = nRightMargin - nActBorder;
nRight = PixelHAdjust( nConvert - lAppNullOffset, mpParaItem->GetRight() );
}
else
{
nRight = PixelHAdjust(
ConvertHPosLogic(mpBorders[GetActRightColumn(sal_True)].nPos) -
ConvertHPosLogic(mpIndents[INDENT_RIGHT_MARGIN].nPos) -
lAppNullOffset,
mpParaItem->GetRight());
}
}
else
{
if(bRTL)
{
long lBorderLeft = mpParaBorderItem.get() ? mpParaBorderItem->GetLeft() : 0;
nRight = PixelHAdjust(
ConvertHPosLogic(GetMargin1()) +
ConvertHPosLogic(mpIndents[INDENT_RIGHT_MARGIN].nPos) -
GetLeftFrameMargin() +
lBorderLeft -
lAppNullOffset,
mpParaItem->GetRight());
}
else
{
nRight = PixelHAdjust(
ConvertHPosLogic(GetMargin2()) -
ConvertHPosLogic(mpIndents[INDENT_RIGHT_MARGIN].nPos) -
lAppNullOffset,
mpParaItem->GetRight());
}
}
if (mbSnapping)
nRight = RoundToCurrentMapMode(nRight);
mpParaItem->SetRight( nRight );
sal_uInt16 nParaId = bHorz ? SID_ATTR_PARA_LRSPACE : SID_ATTR_PARA_LRSPACE_VERTICAL;
pBindings->GetDispatcher()->Execute( nParaId, SFX_CALLMODE_RECORD, mpParaItem.get(), 0L );
sal_uInt16 nParagraphId = bHorz ? SID_ATTR_PARA_LRSPACE : SID_ATTR_PARA_LRSPACE_VERTICAL;
pBindings->GetDispatcher()->Execute( nParagraphId, SFX_CALLMODE_RECORD, mpParaItem.get(), 0L );
UpdateTabs();
}
@@ -2605,8 +2578,8 @@ void SvxRuler::Click()
}
}
sal_Bool SvxRuler::CalcLimits ( long &nMax1, // minimum value to be set
long &nMax2, // minimum value to be set
sal_Bool SvxRuler::CalcLimits ( long& nMax1, // minimum value to be set
long& nMax2, // minimum value to be set
sal_Bool ) const
{
/*
@@ -3501,14 +3474,15 @@ sal_uInt16 SvxRuler::GetActRightColumn(
{
if( nAct == USHRT_MAX )
nAct = mpColumnItem->GetActColumn();
else nAct++; //To be able to pass on the ActDrag
else
nAct++; //To be able to pass on the ActDrag
sal_Bool bConsiderHidden = !bForceDontConsiderHidden &&
!( nDragType & DRAG_OBJECT_ACTLINE_ONLY );
!(nDragType & DRAG_OBJECT_ACTLINE_ONLY);
while( nAct < mpColumnItem->Count() - 1 )
{
if( (*mpColumnItem.get())[nAct].bVisible || bConsiderHidden )
if (mpColumnItem->At(nAct).bVisible || bConsiderHidden)
return nAct;
else
nAct++;
@@ -3523,17 +3497,17 @@ sal_uInt16 SvxRuler::GetActLeftColumn(
if(nAct == USHRT_MAX)
nAct = mpColumnItem->GetActColumn();
sal_uInt16 nLOffs = 1;
sal_uInt16 nLeftOffset = 1;
sal_Bool bConsiderHidden = !bForceDontConsiderHidden &&
!( nDragType & DRAG_OBJECT_ACTLINE_ONLY );
!(nDragType & DRAG_OBJECT_ACTLINE_ONLY);
while(nAct >= nLOffs)
while(nAct >= nLeftOffset)
{
if( (*mpColumnItem.get())[nAct - nLOffs].bVisible || bConsiderHidden )
return nAct-nLOffs;
if (mpColumnItem->At(nAct - nLeftOffset).bVisible || bConsiderHidden)
return nAct - nLeftOffset;
else
nLOffs++;
nLeftOffset++;
}
return USHRT_MAX;
}