summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJustin Luth <justin_luth@sil.org>2015-09-07 08:19:22 +0300
committerJustin Luth <justin_luth@sil.org>2015-10-17 13:50:51 +0000
commitfbd1c167851a04c60d91daa830cf93e5b2ad7b4d (patch)
tree4805db732536a2a2819ad2565bc1ffd22300cea0
parent1769074bd556e21e0c6ed29d9059960f998e28d1 (diff)
tdf#36117 .doc preserve page vertical alignment after RT
MSWord has a page-style vertical alignment (center/bottom/justify) setting that was lost after round-tripping through LibreOffice. Writer does not currently have the ability to vertically align text outside of a frame, but the setting should be preserved for interoperability. Change-Id: I91ae841b91ca2f2dd1b68212fdcdf830c7cef22a Reviewed-on: https://gerrit.libreoffice.org/18480 Tested-by: Jenkins <ci@libreoffice.org> Reviewed-by: Justin Luth <justin_luth@sil.org>
-rw-r--r--sw/inc/pagedesc.hxx7
-rw-r--r--sw/qa/extras/ww8export/data/tdf36117_verticalAdjustment.docbin0 -> 27648 bytes
-rw-r--r--sw/qa/extras/ww8export/ww8export.cxx27
-rw-r--r--sw/source/core/layout/pagedesc.cxx5
-rw-r--r--sw/source/filter/ww8/attributeoutputbase.hxx6
-rw-r--r--sw/source/filter/ww8/wrtw8sty.cxx28
-rw-r--r--sw/source/filter/ww8/ww8attributeoutput.hxx3
-rw-r--r--sw/source/filter/ww8/ww8par.cxx2
-rw-r--r--sw/source/filter/ww8/ww8par.hxx6
-rw-r--r--sw/source/filter/ww8/ww8par2.cxx8
-rw-r--r--sw/source/filter/ww8/ww8par6.cxx40
11 files changed, 125 insertions, 7 deletions
diff --git a/sw/inc/pagedesc.hxx b/sw/inc/pagedesc.hxx
index b258ec1fc155..258f63464b81 100644
--- a/sw/inc/pagedesc.hxx
+++ b/sw/inc/pagedesc.hxx
@@ -26,6 +26,9 @@
#include <frmfmt.hxx>
#include <editeng/numitem.hxx>
#include <editeng/borderline.hxx>
+#include <com/sun/star/drawing/TextVerticalAdjust.hpp>
+
+using namespace ::com::sun::star;
class SfxPoolItem;
class SwTextFormatColl;
@@ -143,6 +146,7 @@ class SW_DLLPUBLIC SwPageDesc : public SwModify
SwPageDesc *m_pFollow;
sal_uInt16 m_nRegHeight; ///< Sentence spacing and fontascent of style.
sal_uInt16 m_nRegAscent; ///< For grid alignment (Registerhaltigkeit).
+ drawing::TextVerticalAdjust m_nVerticalAdjustment; // doc/docx: vertically center / justify / bottom
UseOnPage m_eUse;
bool m_IsLandscape;
bool m_IsHidden;
@@ -216,6 +220,9 @@ public:
void SetRegHeight(sal_uInt16 const nNew) { m_nRegHeight = nNew; }
void SetRegAscent(sal_uInt16 const nNew) { m_nRegAscent = nNew; }
+ drawing::TextVerticalAdjust GetVerticalAdjustment () const {return m_nVerticalAdjustment; }
+ void SetVerticalAdjustment (const drawing::TextVerticalAdjust nVA) {m_nVerticalAdjustment = nVA; }
+
inline void SetFollow( const SwPageDesc* pNew );
const SwPageDesc* GetFollow() const { return m_pFollow; }
SwPageDesc* GetFollow() { return m_pFollow; }
diff --git a/sw/qa/extras/ww8export/data/tdf36117_verticalAdjustment.doc b/sw/qa/extras/ww8export/data/tdf36117_verticalAdjustment.doc
new file mode 100644
index 000000000000..f7afd4191576
--- /dev/null
+++ b/sw/qa/extras/ww8export/data/tdf36117_verticalAdjustment.doc
Binary files differ
diff --git a/sw/qa/extras/ww8export/ww8export.cxx b/sw/qa/extras/ww8export/ww8export.cxx
index 6c9b0077cbfd..6a54c5daffeb 100644
--- a/sw/qa/extras/ww8export/ww8export.cxx
+++ b/sw/qa/extras/ww8export/ww8export.cxx
@@ -11,6 +11,7 @@
#include <com/sun/star/form/validation/XValidatableFormComponent.hpp>
#include <com/sun/star/frame/XStorable.hpp>
+#include <com/sun/star/drawing/TextVerticalAdjust.hpp>
#include <com/sun/star/drawing/XControlShape.hpp>
#include <com/sun/star/beans/XPropertySet.hpp>
#include <com/sun/star/view/XViewSettingsSupplier.hpp>
@@ -19,6 +20,7 @@
#include <com/sun/star/text/GraphicCrop.hpp>
#include <com/sun/star/text/XFormField.hpp>
#include <com/sun/star/view/DocumentZoomType.hpp>
+#include <pagedesc.hxx>
#include <sfx2/bindings.hxx>
#include <sfx2/request.hxx>
@@ -498,6 +500,31 @@ DECLARE_WW8EXPORT_TEST(testCommentedTable, "commented-table.doc")
CPPUNIT_ASSERT_EQUAL(OUString("fore." SAL_NEWLINE_STRING "A1" SAL_NEWLINE_STRING "B1" SAL_NEWLINE_STRING "Afte"), xField->getAnchor()->getString());
}
+DECLARE_WW8EXPORT_TEST(testTextVerticalAdjustment, "tdf36117_verticalAdjustment.doc")
+{
+ //Preserve the page vertical alignment setting for .doc
+ SwXTextDocument* pTextDoc = dynamic_cast<SwXTextDocument *>(mxComponent.get());
+ CPPUNIT_ASSERT(pTextDoc);
+ SwDoc* pDoc = pTextDoc->GetDocShell()->GetDoc();
+ CPPUNIT_ASSERT(pDoc);
+
+ SwPageDesc &Desc = pDoc->GetPageDesc( 0 );
+ drawing::TextVerticalAdjust nVA = Desc.GetVerticalAdjustment();
+ CPPUNIT_ASSERT_EQUAL( drawing::TextVerticalAdjust_CENTER, nVA );
+
+ Desc = pDoc->GetPageDesc( 1 );
+ nVA = Desc.GetVerticalAdjustment();
+ CPPUNIT_ASSERT_EQUAL( drawing::TextVerticalAdjust_TOP, nVA );
+
+ Desc = pDoc->GetPageDesc( 2 );
+ nVA = Desc.GetVerticalAdjustment();
+ CPPUNIT_ASSERT_EQUAL( drawing::TextVerticalAdjust_BOTTOM, nVA );
+
+ Desc = pTextDoc->GetDocShell()->GetDoc()->GetPageDesc( 3 );
+ nVA = Desc.GetVerticalAdjustment();
+ CPPUNIT_ASSERT_EQUAL( drawing::TextVerticalAdjust_BLOCK, nVA );
+}
+
DECLARE_WW8EXPORT_TEST(testCommentExport, "comment-export.odt")
{
struct TextPortionInfo {
diff --git a/sw/source/core/layout/pagedesc.cxx b/sw/source/core/layout/pagedesc.cxx
index aa53e362fd88..a236b1c3740b 100644
--- a/sw/source/core/layout/pagedesc.cxx
+++ b/sw/source/core/layout/pagedesc.cxx
@@ -36,8 +36,6 @@
#include <poolfmt.hxx>
#include <calbck.hxx>
-using namespace ::com::sun::star;
-
SwPageDesc::SwPageDesc(const OUString& rName, SwFrameFormat *pFormat, SwDoc *const pDoc)
: SwModify(nullptr)
, m_StyleName( rName )
@@ -49,6 +47,7 @@ SwPageDesc::SwPageDesc(const OUString& rName, SwFrameFormat *pFormat, SwDoc *con
, m_pFollow( this )
, m_nRegHeight( 0 )
, m_nRegAscent( 0 )
+ , m_nVerticalAdjustment( drawing::TextVerticalAdjust_TOP )
, m_eUse( (UseOnPage)(nsUseOnPage::PD_ALL | nsUseOnPage::PD_HEADERSHARE | nsUseOnPage::PD_FOOTERSHARE | nsUseOnPage::PD_FIRSTSHARE) )
, m_IsLandscape( false )
, m_IsHidden( false )
@@ -67,6 +66,7 @@ SwPageDesc::SwPageDesc( const SwPageDesc &rCpy )
, m_pFollow( rCpy.m_pFollow )
, m_nRegHeight( rCpy.GetRegHeight() )
, m_nRegAscent( rCpy.GetRegAscent() )
+ , m_nVerticalAdjustment( rCpy.GetVerticalAdjustment() )
, m_eUse( rCpy.ReadUseOn() )
, m_IsLandscape( rCpy.GetLandscape() )
, m_IsHidden( rCpy.IsHidden() )
@@ -90,6 +90,7 @@ SwPageDesc & SwPageDesc::operator = (const SwPageDesc & rSrc)
m_nRegHeight = rSrc.m_nRegHeight;
m_nRegAscent = rSrc.m_nRegAscent;
+ m_nVerticalAdjustment = rSrc.m_nVerticalAdjustment;
m_eUse = rSrc.m_eUse;
m_IsLandscape = rSrc.m_IsLandscape;
return *this;
diff --git a/sw/source/filter/ww8/attributeoutputbase.hxx b/sw/source/filter/ww8/attributeoutputbase.hxx
index a180564719fb..fd36534a9a80 100644
--- a/sw/source/filter/ww8/attributeoutputbase.hxx
+++ b/sw/source/filter/ww8/attributeoutputbase.hxx
@@ -29,6 +29,7 @@
#include <tools/solar.h>
#include <boost/optional.hpp>
+#include <com/sun/star/drawing/TextVerticalAdjust.hpp>
#include <swtypes.hxx>
#include <wrtswtbl.hxx>
#include <fldbas.hxx>
@@ -36,6 +37,8 @@
#include <vector>
+using namespace ::com::sun::star;
+
class Point;
class SvxCaseMapItem;
class SvxColorItem;
@@ -293,6 +296,9 @@ public:
/// msword::ColumnBreak or msword::PageBreak
virtual void SectionBreak( sal_uInt8 nC, const WW8_SepInfo* pSectionInfo = NULL ) = 0;
+ // preserve page vertical alignment
+ virtual void TextVerticalAdjustment( const drawing::TextVerticalAdjust) {};
+
/// Start of the section properties.
virtual void StartSection() = 0;
diff --git a/sw/source/filter/ww8/wrtw8sty.cxx b/sw/source/filter/ww8/wrtw8sty.cxx
index b102aea21134..1e710a635cf9 100644
--- a/sw/source/filter/ww8/wrtw8sty.cxx
+++ b/sw/source/filter/ww8/wrtw8sty.cxx
@@ -1440,6 +1440,30 @@ void WW8Export::SetupSectionPositions( WW8_PdAttrDesc* pA )
}
}
+void WW8AttributeOutput::TextVerticalAdjustment( const drawing::TextVerticalAdjust nVA )
+{
+ if ( drawing::TextVerticalAdjust_TOP != nVA ) // top alignment is the default
+ {
+ sal_uInt8 nMSVA = 0;
+ switch( nVA )
+ {
+ case drawing::TextVerticalAdjust_CENTER:
+ nMSVA = 1;
+ break;
+ case drawing::TextVerticalAdjust_BOTTOM: //Writer = 2, Word = 3
+ nMSVA = 3;
+ break;
+ case drawing::TextVerticalAdjust_BLOCK: //Writer = 3, Word = 2
+ nMSVA = 2;
+ break;
+ default:
+ break;
+ }
+ SwWW8Writer::InsUInt16( *m_rWW8Export.pO, NS_sprm::LN_SVjc );
+ m_rWW8Export.pO->push_back( nMSVA );
+ }
+}
+
void WW8Export::WriteHeadersFooters( sal_uInt8 nHeadFootFlags,
const SwFrameFormat& rFormat, const SwFrameFormat& rLeftFormat, const SwFrameFormat& rFirstPageFormat, sal_uInt8 nBreakCode )
{
@@ -1666,6 +1690,10 @@ void MSWordExportBase::SectionProperties( const WW8_SepInfo& rSepInfo, WW8_PdAtt
AttrOutput().SectionType( nBreakCode );
+ if( rSepInfo.pPageDesc ) {
+ AttrOutput().TextVerticalAdjustment( rSepInfo.pPageDesc->GetVerticalAdjustment() );
+ }
+
// Header or Footer
sal_uInt8 nHeadFootFlags = 0;
diff --git a/sw/source/filter/ww8/ww8attributeoutput.hxx b/sw/source/filter/ww8/ww8attributeoutput.hxx
index 294686e5bd71..59f183f639a7 100644
--- a/sw/source/filter/ww8/ww8attributeoutput.hxx
+++ b/sw/source/filter/ww8/ww8attributeoutput.hxx
@@ -147,6 +147,9 @@ public:
/// msword::ColumnBreak or msword::PageBreak
virtual void SectionBreak( sal_uInt8 nC, const WW8_SepInfo* pSectionInfo = NULL ) override;
+ // preserve DOC page vertical alignment
+ virtual void TextVerticalAdjustment( const drawing::TextVerticalAdjust ) SAL_OVERRIDE;
+
/// Start of the section properties.
virtual void StartSection() override;
diff --git a/sw/source/filter/ww8/ww8par.cxx b/sw/source/filter/ww8/ww8par.cxx
index f2f5dbe1c15c..2d4e71066b11 100644
--- a/sw/source/filter/ww8/ww8par.cxx
+++ b/sw/source/filter/ww8/ww8par.cxx
@@ -4327,6 +4327,8 @@ void wwSectionManager::SetSegmentToPageDesc(const wwSection &rSection,
GetPageULData(rSection, aULData);
SetPageULSpaceItems(rFormat, aULData, rSection);
+ rPage.SetVerticalAdjustment( rSection.mnVerticalAdjustment );
+
SetPage(rPage, rFormat, rSection, bIgnoreCols);
if (!(rSection.maSep.pgbApplyTo & 1))
diff --git a/sw/source/filter/ww8/ww8par.hxx b/sw/source/filter/ww8/ww8par.hxx
index 64fb6cce03fe..1f6933c1d555 100644
--- a/sw/source/filter/ww8/ww8par.hxx
+++ b/sw/source/filter/ww8/ww8par.hxx
@@ -45,6 +45,7 @@
#include <xmloff/odffields.hxx>
#include <IMark.hxx>
+#include <com/sun/star/drawing/TextVerticalAdjust.hpp>
#include <swtypes.hxx>
#include <fmtfsize.hxx>
#include <fmtornt.hxx>
@@ -55,6 +56,8 @@
#include <boost/noncopyable.hpp>
+using namespace ::com::sun::star;
+
class SwDoc;
class SwPaM;
class SfxPoolItem;
@@ -810,6 +813,7 @@ public:
sal_uInt32 nPgLeft;
sal_uInt32 nPgRight;
+ drawing::TextVerticalAdjust mnVerticalAdjustment;
sal_uInt8 mnBorders;
bool mbHasFootnote;
void SetDirection();
@@ -896,6 +900,7 @@ public:
explicit wwSectionManager(SwWW8ImplReader &rReader) : mrReader(rReader), mnDesc(0)
{}
void SetCurrentSectionHasFootnote();
+ void SetCurrentSectionVerticalAdjustment(const drawing::TextVerticalAdjust nVA);
bool CurrentSectionIsVertical() const;
bool CurrentSectionIsProtected() const;
void PrependedInlineNode(const SwPosition &rPos, const SwNode &rNode);
@@ -1817,6 +1822,7 @@ public: // really private, but can only be done public
void Read_ParaBiDi(sal_uInt16, const sal_uInt8* pData, short nLen);
static sal_uInt32 ExtractColour(const sal_uInt8* &rpData, bool bVer67);
+ void Read_TextVerticalAdjustment(sal_uInt16, const sal_uInt8* pData, short nLen);
void Read_UnderlineColor(sal_uInt16, const sal_uInt8* pData, short nLen);
long MapBookmarkVariables(const WW8FieldDesc* pF, OUString &rOrigName,
const OUString &rData);
diff --git a/sw/source/filter/ww8/ww8par2.cxx b/sw/source/filter/ww8/ww8par2.cxx
index 757d14bb7284..233cc11627c6 100644
--- a/sw/source/filter/ww8/ww8par2.cxx
+++ b/sw/source/filter/ww8/ww8par2.cxx
@@ -224,6 +224,14 @@ void wwSectionManager::SetCurrentSectionHasFootnote()
maSegments.back().mbHasFootnote = true;
}
+void wwSectionManager::SetCurrentSectionVerticalAdjustment(const drawing::TextVerticalAdjust nVA)
+{
+ OSL_ENSURE(!maSegments.empty(),
+ "should not be possible, must be at least one segment");
+ if ( !maSegments.empty() )
+ maSegments.back().mnVerticalAdjustment = nVA;
+}
+
bool wwSectionManager::CurrentSectionIsVertical() const
{
OSL_ENSURE(!maSegments.empty(),
diff --git a/sw/source/filter/ww8/ww8par6.cxx b/sw/source/filter/ww8/ww8par6.cxx
index 2077882e962b..85b2fc614cdd 100644
--- a/sw/source/filter/ww8/ww8par6.cxx
+++ b/sw/source/filter/ww8/ww8par6.cxx
@@ -754,10 +754,17 @@ void SwWW8ImplReader::HandleLineNumbering(const wwSection &rSection)
}
}
-wwSection::wwSection(const SwPosition &rPos) : maStart(rPos.nNode),
- mpSection(0), mpPage(0), meDir(FRMDIR_HORI_LEFT_TOP), mLinkId(0),
- nPgWidth(SvxPaperInfo::GetPaperSize(PAPER_A4).Width()),
- nPgLeft(MM_250), nPgRight(MM_250), mnBorders(0), mbHasFootnote(false)
+wwSection::wwSection(const SwPosition &rPos) : maStart(rPos.nNode)
+ , mpSection(0)
+ , mpPage(0)
+ , meDir(FRMDIR_HORI_LEFT_TOP)
+ , mLinkId(0)
+ , nPgWidth(SvxPaperInfo::GetPaperSize(PAPER_A4).Width())
+ , nPgLeft(MM_250)
+ , nPgRight(MM_250)
+ , mnVerticalAdjustment(drawing::TextVerticalAdjust_TOP)
+ , mnBorders(0)
+ , mbHasFootnote(false)
{
}
@@ -4707,6 +4714,29 @@ sal_uInt32 SwWW8ImplReader::ExtractColour(const sal_uInt8* &rpData, bool bVer67)
return aShade.aColor.GetColor();
}
+void SwWW8ImplReader::Read_TextVerticalAdjustment( sal_uInt16, const sal_uInt8* pData, short nLen )
+{
+ if( nLen > 0 )
+ {
+ drawing::TextVerticalAdjust nVA = drawing::TextVerticalAdjust_TOP;
+ switch( *pData )
+ {
+ case 1:
+ nVA = drawing::TextVerticalAdjust_CENTER;
+ break;
+ case 2: //justify
+ nVA = drawing::TextVerticalAdjust_BLOCK;
+ break;
+ case 3:
+ nVA = drawing::TextVerticalAdjust_BOTTOM;
+ break;
+ default:
+ break;
+ }
+ m_aSectionManager.SetCurrentSectionVerticalAdjustment( nVA );
+ }
+}
+
void SwWW8ImplReader::Read_Border(sal_uInt16 , const sal_uInt8*, short nLen)
{
if( nLen < 0 )
@@ -5983,7 +6013,7 @@ const wwSprmDispatcher *GetWW8SprmDispatcher()
//sep.dyaHdrBottom;dya;word;
{0x3019, 0}, //"sprmSLBetween"
//sep.fLBetween;0 or 1;byte;
- {0x301A, 0}, //"sprmSVjc" sep.vjc;vjc;byte;
+ {0x301A, &SwWW8ImplReader::Read_TextVerticalAdjustment}, //"sprmSVjc" sep.vjc;vjc;byte;
{0x501B, 0}, //"sprmSLnnMin" sep.lnnMin;lnn;
//word;
{0x501C, 0}, //"sprmSPgnStart" sep.pgnStart;