summaryrefslogtreecommitdiff
path: root/sw/inc
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 /sw/inc
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 'sw/inc')
-rw-r--r--sw/inc/doc.hxx10
-rw-r--r--sw/inc/fmtornt.hxx3
-rw-r--r--sw/inc/tblafmt.hxx79
3 files changed, 88 insertions, 4 deletions
diff --git a/sw/inc/doc.hxx b/sw/inc/doc.hxx
index b71b98f85e95..7f4a1cc47ca3 100644
--- a/sw/inc/doc.hxx
+++ b/sw/inc/doc.hxx
@@ -1900,6 +1900,16 @@ public:
const editeng::SvxBorderLine* pBorderLine );
void GetTabBorders( const SwCursor& rCursor, SfxItemSet& rSet ) const;
void SetBoxAttr( const SwCursor& rCursor, const SfxPoolItem &rNew );
+ /**
+ Retrieves a box attribute from the given cursor.
+
+ @return Whether the property is set over the current box selection.
+
+ @remarks A property is 'set' if it's set to the same value over all boxes in the current selection.
+ The property value is retrieved from the first box in the current selection. It is then compared to
+ the values of the same property over any other boxes in the selection; if any value is different from
+ that of the first box, the property is unset (and sal_False is returned).
+ */
sal_Bool GetBoxAttr( const SwCursor& rCursor, SfxPoolItem &rToFill ) const;
void SetBoxAlign( const SwCursor& rCursor, sal_uInt16 nAlign );
sal_uInt16 GetBoxAlign( const SwCursor& rCursor ) const;
diff --git a/sw/inc/fmtornt.hxx b/sw/inc/fmtornt.hxx
index ac196412fba5..a4055da5db8f 100644
--- a/sw/inc/fmtornt.hxx
+++ b/sw/inc/fmtornt.hxx
@@ -64,6 +64,9 @@ public:
virtual bool QueryValue( com::sun::star::uno::Any& rVal, sal_uInt8 nMemberId = 0 ) const;
virtual bool PutValue( const com::sun::star::uno::Any& rVal, sal_uInt8 nMemberId = 0 );
+ SvStream& Store(SvStream &rStream, sal_uInt16 itemVersion) const;
+ SfxPoolItem* Create(SvStream &rStream, sal_uInt16 itemVersion) const;
+
sal_Int16 GetVertOrient() const { return eOrient; }
sal_Int16 GetRelationOrient() const { return eRelation; }
void SetVertOrient( sal_Int16 eNew ) { eOrient = eNew; }
diff --git a/sw/inc/tblafmt.hxx b/sw/inc/tblafmt.hxx
index 6ab318a27439..ecce6991a0fb 100644
--- a/sw/inc/tblafmt.hxx
+++ b/sw/inc/tblafmt.hxx
@@ -53,9 +53,17 @@
#include <editeng/brshitem.hxx>
#include <editeng/adjitem.hxx>
#include <editeng/justifyitem.hxx>
+#include <editeng/brkitem.hxx>
+#include <editeng/keepitem.hxx>
+#include <editeng/frmdiritem.hxx>
+#include <editeng/shaditem.hxx>
#include <svx/rotmodit.hxx>
#include <svl/intitem.hxx>
#include <editeng/bolnitem.hxx>
+#include <fmtpdsc.hxx>
+#include <fmtlsplt.hxx>
+#include <fmtrowsplt.hxx>
+#include <fmtornt.hxx>
#include "swdllapi.h"
struct SwAfVersions;
@@ -94,6 +102,8 @@ class SwBoxAutoFmt
// Writer specific
SvxAdjustItem aAdjust;
+ SvxFrameDirectionItem m_aTextOrientation;
+ SwFmtVertOrient m_aVerticalAlignment;
// Calc specific
SvxHorJustifyItem aHorJustify;
@@ -136,6 +146,8 @@ public:
const SvxShadowedItem &GetShadowed() const { return aShadowed; }
const SvxColorItem &GetColor() const { return aColor; }
const SvxAdjustItem &GetAdjust() const { return aAdjust; }
+ const SvxFrameDirectionItem& GetTextOrientation() const { return m_aTextOrientation; }
+ const SwFmtVertOrient& GetVerticalAlignment() const { return m_aVerticalAlignment; }
const SvxBoxItem &GetBox() const { return aBox; }
const SvxLineItem &GetTLBR() const { return aTLBR; }
const SvxLineItem &GetBLTR() const { return aBLTR; }
@@ -168,14 +180,16 @@ public:
aAdjust.SetOneWord( rNew.GetOneWord() );
aAdjust.SetLastBlock( rNew.GetLastBlock() );
}
+ void SetTextOrientation(const SvxFrameDirectionItem& rNew) { m_aTextOrientation = rNew; }
+ void SetVerticalAlignment(const SwFmtVertOrient& rNew) { m_aVerticalAlignment = rNew; }
void SetBox( const SvxBoxItem& rNew ) { aBox = rNew; }
void SetBackground( const SvxBrushItem& rNew ) { aBackground = rNew; }
void SetValueFormat( const String& rFmt, LanguageType eLng, LanguageType eSys )
{ sNumFmtString = rFmt; eNumFmtLanguage = eLng; eSysLanguage = eSys; }
sal_Bool Load( SvStream& rStream, const SwAfVersions& rVersions, sal_uInt16 nVer );
- sal_Bool Save( SvStream& rStream ) const;
- sal_Bool SaveVerionNo( SvStream& rStream ) const;
+ sal_Bool Save( SvStream& rStream, sal_uInt16 fileVersion ) const;
+ sal_Bool SaveVersionNo( SvStream& rStream, sal_uInt16 fileVersion ) const;
#ifdef READ_OLDVERS
// load old version.
@@ -183,6 +197,50 @@ public:
#endif
};
+/*
+@remarks
+A table has a number of lines. These lines seem to correspond with rows, except in the case of
+rows spanning more than one line. Each line contains a number of boxes/cells.
+
+AutoFormat properties are retrieved and stored in a grid of 16 table boxes. A sampling approach
+is used to read the data. 4 lines are picked, and 4 boxes are picked from each.
+
+The line picking and box picking algorithms are similar. We start at the first line/box, and pick
+lines/boxes one by one for a maximum of 3. The 4th line/box is the last line/box in the current
+table/line. If we hit the end of lines/boxes, the last line/box encountered is picked several times.
+
+For example, in a 2x3 table, the 4 lines will be [0, 1, 1, 1]. In each line, the boxes will be
+[0, 1, 2, 2]. In a 6x5 table, the 4 lines will be [0, 1, 2, 4] and the boxes per line will be
+[0, 1, 2, 5].
+
+As you can see, property extraction/application is lossless for tables that are 4x4 or smaller
+(and in fact has a bit of redundnacy). For larger tables, we lose any individual cell formatting
+for the range [(3,rows - 1) -> (3, cols - 1)]. That formatting is replaced by formatting from
+the saved cells:
+
+ 0 1 2 3 4 5
+ +-----------------------------------------------------------------------+
+ 0 | Saved | Saved | Saved | | | Saved |
+ +-----------------------------------------------------------------------+
+ 1 | Saved | Saved | Saved | | | Saved |
+ +-----------------------------------------------------------------------+
+ 2 | Saved | Saved | Saved | | | Saved |
+ +-----------------------------------------------------------------------+
+ 3 | | | | | | |
+ +-----------------------------------------------------------------------+
+ 4 | | | | | | |
+ +-----------------------------------------------------------------------+
+ 5 | Saved | Saved | Saved | | | Saved |
+ +-----------+-----------+-----------+-----------+-----------+-----------+
+
+The properties saved are divided into three categories:
+ 1. Character properties: Font, font size, weight, etc.
+ 2. Box properties: Box, cell background
+ 3. Table properties: Properties that are set in the Table->Table Properties dialog.
+
+Character and box properties are stored per cell (and are lossy for tables larger than 4x4). Table
+properties are stored per-table, and are lossless.
+*/
class SW_DLLPUBLIC SwTableAutoFmt
{
friend void _FinitCore(); // To destroy dflt. pointer.
@@ -203,6 +261,16 @@ class SW_DLLPUBLIC SwTableAutoFmt
SwBoxAutoFmt* aBoxAutoFmt[ 16 ];
+ // Writer-specific options
+ SvxFmtBreakItem m_aBreak;
+ SwFmtPageDesc m_aPageDesc;
+ SvxFmtKeepItem m_aKeepWithNextPara;
+ sal_uInt16 m_aRepeatHeading;
+ sal_Bool m_bLayoutSplit;
+ sal_Bool m_bRowSplit;
+ sal_Bool m_bCollapsingBorders;
+ SvxShadowItem m_aShadow;
+
public:
SwTableAutoFmt( const String& rName );
SwTableAutoFmt( const SwTableAutoFmt& rNew );
@@ -217,11 +285,14 @@ public:
const String& GetName() const { return aName; }
enum UpdateFlags { UPDATE_CHAR = 1, UPDATE_BOX = 2, UPDATE_ALL = 3 };
- SwBoxAutoFmt& UpdateFromSet( sal_uInt8 nPos, const SfxItemSet& rSet,
+ void UpdateFromSet( sal_uInt8 nPos, const SfxItemSet& rSet,
UpdateFlags eFlags, SvNumberFormatter* );
void UpdateToSet( sal_uInt8 nPos, SfxItemSet& rSet, UpdateFlags eFlags,
SvNumberFormatter* ) const ;
+ void RestoreTableProperties(SwTable &table) const;
+ void StoreTableProperties(const SwTable &table);
+
sal_Bool IsFont() const { return bInclFont; }
sal_Bool IsJustify() const { return bInclJustify; }
sal_Bool IsFrame() const { return bInclFrame; }
@@ -236,7 +307,7 @@ public:
void SetWidthHeight( const sal_Bool bNew ) { bInclWidthHeight = bNew; }
sal_Bool Load( SvStream& rStream, const SwAfVersions& );
- sal_Bool Save( SvStream& rStream ) const;
+ sal_Bool Save( SvStream& rStream, sal_uInt16 fileVersion ) const;
#ifdef READ_OLDVERS
// Load old versions.