summaryrefslogtreecommitdiff
path: root/editeng
diff options
context:
space:
mode:
authorMuhammad Haggag <mhaggag@gmail.com>2012-04-22 21:20:25 +0200
committerMichael Stahl <mstahl@redhat.com>2012-05-03 11:12:12 +0200
commit7e8c0bd73ee59ff3041e55268c77203373962e51 (patch)
treea7a257f5ae1a48ebb30818c450a215f4817456da /editeng
parent002127460ad4b18fd66723e93c3d308ffc7207b1 (diff)
fdo#31005 Table Autoformats do not save/apply all properties
This change expands the number of properties supported by autoformats, mainly for Writer. Some improvements affect Calc as well (e.g. border styles are now preserved for Calc). Common: boxitem.hxx, frmitems.cxx * Added a new version for SvxBoxItem serialization that includes border styles. * Updated SvxBoxItem and SvxBorderLine serialization logic accordingly. Writer: fmtornt.hxx, attrfrm.cxx * Added serialization/deserialization logic for SwFmtVertOrient. Writer: tblafmt.hxx, tblafmt.cxx, ndtbl.cxx * Updated file version for autotbl.fmt to be SOFFICE_FILEFORMAT_50. * Autoformats now record the text orientation and vertical alignment of table cells. * Autoformats now record the following table-level properties: - Break - Keep with next paragraph - Repeat heading - Allow table split across pages - Allow rows to break across pages - Merge adjacent line styles - Table shadow Calc: autoform.hxx, autoform.cxx * Added support for reading/writing writer-specific data as binary blobs. * Updated file version for autotbl.fmt to be SOFFICE_FILEFORMAT_50.
Diffstat (limited to 'editeng')
-rw-r--r--editeng/inc/editeng/boxitem.hxx9
-rw-r--r--editeng/source/items/frmitems.cxx63
2 files changed, 61 insertions, 11 deletions
diff --git a/editeng/inc/editeng/boxitem.hxx b/editeng/inc/editeng/boxitem.hxx
index 46597705fc92..1d9062f9cf6f 100644
--- a/editeng/inc/editeng/boxitem.hxx
+++ b/editeng/inc/editeng/boxitem.hxx
@@ -48,7 +48,16 @@ namespace rtl { class OUString; }
#define BOX_LINE_LEFT ((sal_uInt16)2)
#define BOX_LINE_RIGHT ((sal_uInt16)3)
+/**
+This version causes SvxBoxItem to store the 4 cell spacing distances separately
+when serializing to stream.
+*/
#define BOX_4DISTS_VERSION ((sal_uInt16)1)
+/**
+This version causes SvxBoxItem to store the styles for its border lines when
+serializing to stream.
+*/
+#define BOX_BORDER_STYLE_VERSION ((sal_uInt16)2)
class EDITENG_DLLPUBLIC SvxBoxItem : public SfxPoolItem
{
diff --git a/editeng/source/items/frmitems.cxx b/editeng/source/items/frmitems.cxx
index d4b876bc11c9..f98058e93747 100644
--- a/editeng/source/items/frmitems.cxx
+++ b/editeng/source/items/frmitems.cxx
@@ -124,6 +124,54 @@ inline void SetValueProp( XubString& rStr, const short nValue,
// -----------------------------------------------------------------------
+/*
+SvxBorderLine is not an SfxPoolItem, and has no Store/Create serialization/deserialization methods.
+Since border line information needs to be serialized by the table autoformat code, these file-local
+methods are defined to encapsulate the necessary serialization logic.
+*/
+namespace
+{
+ /// Item version for saved border lines. The old version saves the line without style information.
+ const int BORDER_LINE_OLD_VERSION = 0;
+ /// Item version for saved border lies. The new version includes line style.
+ const int BORDER_LINE_WITH_STYLE_VERSION = 1;
+
+ /// Store a border line to a stream.
+ SvStream& StoreBorderLine(SvStream &stream, const SvxBorderLine &l, sal_uInt16 version)
+ {
+ stream << l.GetColor()
+ << l.GetOutWidth()
+ << l.GetInWidth()
+ << l.GetDistance();
+
+ if (version >= BORDER_LINE_WITH_STYLE_VERSION)
+ stream << static_cast<sal_uInt16>(l.GetStyle());
+
+ return stream;
+ }
+
+ /// Creates a border line from a stream.
+ SvxBorderLine CreateBorderLine(SvStream &stream, sal_uInt16 version)
+ {
+ sal_uInt16 nOutline, nInline, nDistance, nStyle = NO_STYLE;
+ Color aColor;
+ stream >> aColor >> nOutline >> nInline >> nDistance;
+
+ if (version >= BORDER_LINE_WITH_STYLE_VERSION)
+ stream >> nStyle;
+
+ SvxBorderLine border(&aColor);
+ border.GuessLinesWidths(static_cast<SvxBorderStyle>(nStyle), nOutline, nInline, nDistance);
+ return border;
+ }
+
+ /// Retrieves a BORDER_LINE_* version from a BOX_BORDER_* version.
+ sal_uInt16 BorderLineVersionFromBoxVersion(sal_uInt16 boxVersion)
+ {
+ return (boxVersion >= BOX_BORDER_STYLE_VERSION)? BORDER_LINE_WITH_STYLE_VERSION : BORDER_LINE_OLD_VERSION;
+ }
+}
+
TYPEINIT1_FACTORY(SvxPaperBinItem, SfxByteItem, new SvxPaperBinItem(0));
TYPEINIT1_FACTORY(SvxSizeItem, SfxPoolItem, new SvxSizeItem(0));
TYPEINIT1_FACTORY(SvxLRSpaceItem, SfxPoolItem, new SvxLRSpaceItem(0));
@@ -2205,11 +2253,8 @@ SvStream& SvxBoxItem::Store( SvStream& rStrm , sal_uInt16 nItemVersion ) const
const SvxBorderLine* l = pLine[ i ];
if( l )
{
- rStrm << (sal_Int8) i
- << l->GetColor()
- << (sal_uInt16) l->GetOutWidth()
- << (sal_uInt16) l->GetInWidth()
- << (sal_uInt16) l->GetDistance();
+ rStrm << static_cast<sal_Int8>(i);
+ StoreBorderLine(rStrm, *l, BorderLineVersionFromBoxVersion(nItemVersion));
}
}
sal_Int8 cLine = 4;
@@ -2243,7 +2288,7 @@ sal_uInt16 SvxBoxItem::GetVersion( sal_uInt16 nFFVer ) const
SOFFICE_FILEFORMAT_50==nFFVer,
"SvxBoxItem: Gibt es ein neues Fileformat?" );
return SOFFICE_FILEFORMAT_31==nFFVer ||
- SOFFICE_FILEFORMAT_40==nFFVer ? 0 : BOX_4DISTS_VERSION;
+ SOFFICE_FILEFORMAT_40==nFFVer ? 0 : BOX_BORDER_STYLE_VERSION;
}
// -----------------------------------------------------------------------
@@ -2286,12 +2331,8 @@ SfxPoolItem* SvxBoxItem::Create( SvStream& rStrm, sal_uInt16 nIVersion ) const
if( cLine > 3 )
break;
- sal_uInt16 nOutline, nInline, _nDistance;
- Color aColor;
- rStrm >> aColor >> nOutline >> nInline >> _nDistance;
- SvxBorderLine aBorder( &aColor );
- aBorder.GuessLinesWidths( NO_STYLE, nOutline, nInline, _nDistance );
+ SvxBorderLine aBorder = CreateBorderLine(rStrm, BorderLineVersionFromBoxVersion(nIVersion));
pAttr->SetLine( &aBorder, aLineMap[cLine] );
}