summaryrefslogtreecommitdiff
path: root/sw
diff options
context:
space:
mode:
authorMichael Stahl <mstahl@redhat.com>2012-07-04 17:47:22 +0200
committerMichael Stahl <mstahl@redhat.com>2012-07-04 18:06:10 +0200
commite4fc7e777fbfa600dcfe8914da81e89329279e7b (patch)
tree3c17633491fbf236692fb9cd3ec05d05673d42a2 /sw
parent549cf1ab08fc5ee78730c139781ad53805e4717d (diff)
refactor handling of double border widths:
Word uses a completely different definition of "width" of a double border than OOo and ODF: for Word the width is apparently the largest of the 3 component widths, while OOo and ODF define the width as the total with of all 3 components. The new border implementation in LO 3.4 was apparently inspired by Word's double border definition, which resulted in various import filter regressions, see the previous fixes: 36e43b52992735c622833e923faa63774b9e2f76 e2ffb71305c5f085eec6d396651c76d6daee3406 70a6a4d425558340bb49507975343a3e0a1bdde8 These fixes set the ScaleMetrics, which actually seems sub-optimal as there is a ScaleItemSet function somewhere that apparently re-scales all items in an itemset, which could undo the fixes. Also, one of the fixes actually managed to break RTF/DOCX import of double borders, as that ended up in the same code via the API. This commit now reverses the change, so that the width of a border is now always the total with of all components, which is (imho) much more intutitive, and also leads to a consistent UI where selecting say 3pt width has predictable results, no matter what the border style. The border widths are now converted in the Word format import/export filters (writerfilter and sw/source/filter/ww8), and various tests were adapted to the new handling. (cherry picked from commit 2d045cdb69176b280812dda0b813371cf1ac72e2) Conflicts: sw/qa/extras/ooxmltok/ooxmltok.cxx Change-Id: I50456c49b1a298569607e6c88f19f18441348ac3
Diffstat (limited to 'sw')
-rw-r--r--sw/source/filter/ww8/docxattributeoutput.cxx4
-rw-r--r--sw/source/filter/ww8/rtfattributeoutput.cxx10
-rw-r--r--sw/source/filter/ww8/ww8atr.cxx3
-rw-r--r--sw/source/filter/ww8/ww8graf.cxx4
-rw-r--r--sw/source/filter/ww8/ww8par6.cxx6
-rw-r--r--sw/source/filter/xml/xmlithlp.cxx4
6 files changed, 17 insertions, 14 deletions
diff --git a/sw/source/filter/ww8/docxattributeoutput.cxx b/sw/source/filter/ww8/docxattributeoutput.cxx
index 26c0bea2a5e1..2d1bb23366a9 100644
--- a/sw/source/filter/ww8/docxattributeoutput.cxx
+++ b/sw/source/filter/ww8/docxattributeoutput.cxx
@@ -1468,8 +1468,10 @@ static void impl_borderLine( FSHelperPtr pSerializer, sal_Int32 elementToken, co
{
// Compute the sz attribute
+ double const fConverted( ::editeng::ConvertBorderWidthToWord(
+ pBorderLine->GetBorderLineStyle(), pBorderLine->GetWidth()));
// The unit is the 8th of point
- sal_Int32 nWidth = sal_Int32( pBorderLine->GetWidth() / 2.5 );
+ sal_Int32 nWidth = sal_Int32( fConverted / 2.5 );
sal_uInt16 nMinWidth = 2;
sal_uInt16 nMaxWidth = 96;
diff --git a/sw/source/filter/ww8/rtfattributeoutput.cxx b/sw/source/filter/ww8/rtfattributeoutput.cxx
index 3ef3aff38a9c..622426553c67 100644
--- a/sw/source/filter/ww8/rtfattributeoutput.cxx
+++ b/sw/source/filter/ww8/rtfattributeoutput.cxx
@@ -179,12 +179,18 @@ static OString OutTBLBorderLine(RtfExport &rExport, const SvxBorderLine* pLine,
break;
}
+ double const fConverted( ::editeng::ConvertBorderWidthToWord(
+ pLine->GetBorderLineStyle(), pLine->GetWidth()) );
if ( 255 >= pLine->GetWidth() ) // That value comes from RTF specs
{
- aRet.append(OOO_STRING_SVTOOLS_RTF_BRDRW).append((sal_Int32)pLine->GetWidth());
+ aRet.append(OOO_STRING_SVTOOLS_RTF_BRDRW).append(
+ static_cast<sal_Int32>(fConverted));
}
else
- aRet.append(OOO_STRING_SVTOOLS_RTF_BRDRTH OOO_STRING_SVTOOLS_RTF_BRDRW).append((sal_Int32)pLine->GetWidth() / 2);
+ { // use \brdrth to double the value range...
+ aRet.append(OOO_STRING_SVTOOLS_RTF_BRDRTH OOO_STRING_SVTOOLS_RTF_BRDRW);
+ aRet.append(static_cast<sal_Int32>(fConverted) / 2);
+ }
aRet.append(OOO_STRING_SVTOOLS_RTF_BRDRCF);
aRet.append((sal_Int32)rExport.GetColor(pLine->GetColor()));
diff --git a/sw/source/filter/ww8/ww8atr.cxx b/sw/source/filter/ww8/ww8atr.cxx
index 3f2c0c02a641..26db61bedc57 100644
--- a/sw/source/filter/ww8/ww8atr.cxx
+++ b/sw/source/filter/ww8/ww8atr.cxx
@@ -4057,7 +4057,8 @@ WW8_BRC WW8Export::TranslateBorderLine(const SvxBorderLine& rLine,
// what SwRTFWriter::OutRTFBorder does in the RTF filter Eventually it
// would be nice if all this functionality was in the one place
WW8_BRC aBrc;
- sal_uInt16 nWidth = rLine.GetWidth();
+ sal_uInt16 nWidth = ::editeng::ConvertBorderWidthToWord(
+ rLine.GetBorderLineStyle(), rLine.GetWidth());
sal_uInt8 brcType = 0, nColCode = 0;
if( nWidth ) // Linie ?
diff --git a/sw/source/filter/ww8/ww8graf.cxx b/sw/source/filter/ww8/ww8graf.cxx
index 49fb0b216817..9cde7c4f7656 100644
--- a/sw/source/filter/ww8/ww8graf.cxx
+++ b/sw/source/filter/ww8/ww8graf.cxx
@@ -1570,10 +1570,6 @@ sal_Int32 SwWW8ImplReader::MatchSdrBoxIntoFlyBoxItem(const Color& rLineColor,
aLine.SetWidth( nLineThick ); // No conversion here, nLineThick is already in twips
aLine.SetBorderLineStyle(nIdx);
- if (table::BorderLineStyle::DOUBLE == nIdx)
- { // fdo#43249: divide width by 3 for outer line, gap, inner line
- aLine.ScaleMetrics(1, 3);
- }
for(sal_uInt16 nLine = 0; nLine < 4; ++nLine)
rBox.SetLine(new SvxBorderLine( aLine ), nLine);
diff --git a/sw/source/filter/ww8/ww8par6.cxx b/sw/source/filter/ww8/ww8par6.cxx
index 1ed025035f0f..5010d4b2055c 100644
--- a/sw/source/filter/ww8/ww8par6.cxx
+++ b/sw/source/filter/ww8/ww8par6.cxx
@@ -1354,7 +1354,9 @@ void GetLineIndex(SvxBoxItem &rBox, short nLineThickness, short nSpace, sal_uInt
::editeng::SvxBorderLine aLine;
aLine.SetBorderLineStyle( eStyle );
- aLine.SetWidth( nLineThickness );
+ double const fConverted( (table::BorderLineStyle::NONE == eStyle) ? 0.0 :
+ ::editeng::ConvertBorderWidthFromWord(eStyle, nLineThickness));
+ aLine.SetWidth(fConverted);
//No AUTO for borders as yet, so if AUTO, use BLACK
if (nCol == 0)
@@ -1363,7 +1365,7 @@ void GetLineIndex(SvxBoxItem &rBox, short nLineThickness, short nSpace, sal_uInt
aLine.SetColor(SwWW8ImplReader::GetCol(nCol));
if (pSize)
- pSize[nWWIndex] = nLineThickness+nSpace;
+ pSize[nWWIndex] = fConverted + nSpace;
rBox.SetLine(&aLine, nOOIndex);
rBox.SetDistance(nSpace, nOOIndex);
diff --git a/sw/source/filter/xml/xmlithlp.cxx b/sw/source/filter/xml/xmlithlp.cxx
index 0902899899e6..d29853e2af17 100644
--- a/sw/source/filter/xml/xmlithlp.cxx
+++ b/sw/source/filter/xml/xmlithlp.cxx
@@ -218,10 +218,6 @@ sal_Bool lcl_frmitems_setXMLBorder( SvxBorderLine*& rpLine,
rpLine->GetOutWidth();
rpLine->SetWidth( nWidth );
- if (bDouble)
- { // fdo#38542: divide width by 3 for outer line, gap, inner line
- rpLine->ScaleMetrics(1, 3);
- }
}
}
lcl_frmitems_setXMLBorderStyle( *rpLine, nStyle );