add editeng::ConvertBorderWidthFromWord:

Replace the 2 duplicate implementations of this in ww8 and writerfilter
with a common one.  Differences were:
 2) ww8 doubles the with, writerfilter does not
13) unsupported, mapped to THINTHICK_SMALLGAP vs. THICKTHIN_SMALLGAP
22) unsupported, mapped to DASHED vs. SOLID
26) INSET not supported in writerfilter
27) OUTSET not supported in writerfilter

Change-Id: I533b77394388e736f38d70284a6a11061d81e813
This commit is contained in:
Michael Stahl
2012-10-09 18:00:36 +02:00
parent c1d2eed375
commit ecd70a727d
4 changed files with 86 additions and 141 deletions
+4 -1
View File
@@ -52,9 +52,12 @@ namespace editeng {
// values from ::com::sun::star::table::BorderLineStyle
typedef sal_Int16 SvxBorderStyle;
// convert border style between Word formats and LO
SvxBorderStyle EDITENG_DLLPUBLIC ConvertBorderStyleFromWord(int);
/// convert border width in twips between Word formats and LO
double EDITENG_DLLPUBLIC ConvertBorderWidthToWord(SvxBorderStyle, double);
double EDITENG_DLLPUBLIC ConvertBorderWidthFromWord(SvxBorderStyle, double);
double EDITENG_DLLPUBLIC ConvertBorderWidthFromWord(SvxBorderStyle,
double, int);
class EDITENG_DLLPUBLIC SvxBorderLine
{
+75 -2
View File
@@ -117,6 +117,78 @@ SvxBorderLine::SvxBorderLine( const Color *pCol, long nWidth,
aColor = *pCol;
}
SvxBorderStyle
ConvertBorderStyleFromWord(int const nWordLineStyle)
{
switch (nWordLineStyle)
{
// First the single lines
case 1:
case 2: // thick line
case 5:
// and the unsupported special cases which we map to a single line
case 8:
case 9:
case 20:
return SOLID;
break;
case 6:
return DOTTED;
break;
case 7:
case 22:
return DASHED;
break;
// then the shading beams which we represent by a double line
case 23:
return DOUBLE;
break;
// then the double lines, for which we have good matches
case 3:
case 10: // Don't have triple so use double
case 21: // Don't have double wave: use double instead
return DOUBLE;
break;
case 11:
return THINTHICK_SMALLGAP;
break;
case 12:
case 13: // Don't have thin thick thin, so use thick thin
return THICKTHIN_SMALLGAP;
break;
case 14:
return THINTHICK_MEDIUMGAP;
break;
case 15:
case 16: // Don't have thin thick thin, so use thick thin
return THICKTHIN_MEDIUMGAP;
break;
case 17:
return THINTHICK_LARGEGAP;
break;
case 18:
case 19: // Don't have thin thick thin, so use thick thin
return THICKTHIN_LARGEGAP;
break;
case 24:
return EMBOSSED;
break;
case 25:
return ENGRAVED;
break;
case 26:
return OUTSET;
break;
case 27:
return INSET;
break;
default:
return NONE;
break;
}
}
static const double THINTHICK_SMALLGAP_line2 = 15.0;
static const double THINTHICK_SMALLGAP_gap = 15.0;
static const double THINTHICK_LARGEGAP_line1 = 30.0;
@@ -129,7 +201,8 @@ static const double OUTSET_line1 = 15.0;
static const double INSET_line2 = 15.0;
double
ConvertBorderWidthFromWord(SvxBorderStyle const eStyle, double const fWidth)
ConvertBorderWidthFromWord(SvxBorderStyle const eStyle, double const fWidth,
int const nWordLineStyle)
{
switch (eStyle)
{
@@ -137,7 +210,7 @@ ConvertBorderWidthFromWord(SvxBorderStyle const eStyle, double const fWidth)
case SOLID:
case DOTTED:
case DASHED:
return fWidth;
return (2 == nWordLineStyle) ? (fWidth * 2.0) : fWidth;
break;
// Double lines
+3 -73
View File
@@ -1280,83 +1280,13 @@ sal_uInt8 lcl_ReadBorders(bool bVer67, WW8_BRC* brc, WW8PLCFx_Cp_FKP* pPap,
void GetLineIndex(SvxBoxItem &rBox, short nLineThickness, short nSpace, sal_uInt8 nCol, short nIdx,
sal_uInt16 nOOIndex, sal_uInt16 nWWIndex, short *pSize=0)
{
::editeng::SvxBorderStyle eStyle = table::BorderLineStyle::SOLID;
switch (nIdx)
{
// First the single lines
case 1:
case 5:
// and the unsupported special cases which we map to a single line
case 8:
case 9:
case 20:
case 22:
eStyle = table::BorderLineStyle::SOLID;
break;
case 2:
{
eStyle = table::BorderLineStyle::SOLID;
nLineThickness *= 2;
}
break;
case 6:
eStyle = table::BorderLineStyle::DOTTED;
break;
case 7:
eStyle = table::BorderLineStyle::DASHED;
break;
// then the shading beams which we represent by a double line
case 23:
eStyle = table::BorderLineStyle::DOUBLE;
break;
// then the double lines, for which we have good matches
case 3:
case 10: //Don't have tripple so use double
case 21: //Don't have double wave: use double instead
eStyle = table::BorderLineStyle::DOUBLE;
break;
case 11:
eStyle = table::BorderLineStyle::THINTHICK_SMALLGAP;
break;
case 12:
case 13: //Don't have thin thick thin, so use thick thin
eStyle = table::BorderLineStyle::THICKTHIN_SMALLGAP;
break;
case 14:
eStyle = table::BorderLineStyle::THINTHICK_MEDIUMGAP;
break;
case 15:
case 16: //Don't have thin thick thin, so use thick thin
eStyle = table::BorderLineStyle::THICKTHIN_MEDIUMGAP;
break;
case 17:
eStyle = table::BorderLineStyle::THINTHICK_LARGEGAP;
break;
case 18:
case 19: //Don't have thin thick thin, so use thick thin
eStyle = table::BorderLineStyle::THICKTHIN_LARGEGAP;
break;
case 24:
eStyle = table::BorderLineStyle::EMBOSSED;
break;
case 25:
eStyle = table::BorderLineStyle::ENGRAVED;
break;
case 26:
eStyle = table::BorderLineStyle::OUTSET;
break;
case 27:
eStyle = table::BorderLineStyle::INSET;
break;
default:
eStyle = table::BorderLineStyle::NONE;
break;
}
::editeng::SvxBorderStyle const eStyle(
::editeng::ConvertBorderStyleFromWord(nIdx));
::editeng::SvxBorderLine aLine;
aLine.SetBorderLineStyle( eStyle );
double const fConverted( (table::BorderLineStyle::NONE == eStyle) ? 0.0 :
::editeng::ConvertBorderWidthFromWord(eStyle, nLineThickness));
::editeng::ConvertBorderWidthFromWord(eStyle, nLineThickness, nIdx));
aLine.SetWidth(fConverted);
//No AUTO for borders as yet, so if AUTO, use BLACK
@@ -133,77 +133,16 @@ void MakeBorderLine( sal_Int32 nLineThickness, sal_Int32 nLineType,
if(!bIsOOXML && sal::static_int_cast<sal_uInt32>(nLineColor) < SAL_N_ELEMENTS(aBorderDefColor))
nLineColor = aBorderDefColor[nLineColor];
sal_Int16 nLineStyle = NONE;
// Map to our border types, we should use of one equal line
// thickness, or one of smaller thickness. If too small we
// can make the defecit up in additional white space or
// object size
switch(nLineType)
{
// First the single lines
case 1:
case 2:
case 5:
nLineStyle = SOLID;
break;
// Dotted and dashed lines
case 6:
nLineStyle = DOTTED;
break;
case 7:
case 22:
nLineStyle = DASHED;
break;
// and the unsupported special cases which we map to a single line
case 8:
case 9:
case 20:
nLineStyle = SOLID;
break;
// Double line
case 3:
case 10: //Don't have tripple so use double
case 21:
case 23:
nLineStyle = DOUBLE;
break;
case 11:
case 13: //Don't have thin thick thin, so use thick thin
nLineStyle = THINTHICK_SMALLGAP;
break;
case 12:
nLineStyle = THICKTHIN_SMALLGAP;
break;
case 14:
nLineStyle = THINTHICK_MEDIUMGAP;
break;
case 15:
case 16: //Don't have thin thick thin, so use thick thin
nLineStyle = THICKTHIN_MEDIUMGAP;
break;
case 17:
nLineStyle = THINTHICK_LARGEGAP;
break;
case 18:
case 19: //Don't have thin thick thin, so use thick thin
nLineStyle = THICKTHIN_LARGEGAP;
break;
// Embossed and engraved lines
case 24:
nLineStyle = EMBOSSED;
break;
case 25:
nLineStyle = ENGRAVED;
break;
case 0:
case 255:
default:
break;
}
::editeng::SvxBorderStyle const nLineStyle(
::editeng::ConvertBorderStyleFromWord(nLineType));
rToFill.LineStyle = nLineStyle;
double const fConverted( (NONE == nLineStyle) ? 0.0 :
::editeng::ConvertBorderWidthFromWord(nLineStyle, nLineThickness));
::editeng::ConvertBorderWidthFromWord(nLineStyle, nLineThickness,
nLineType));
rToFill.LineWidth = convertTwipToMM100(fConverted);
rToFill.Color = nLineColor;
}