summaryrefslogtreecommitdiff
path: root/sc/source/filter/xcl97
diff options
context:
space:
mode:
authorKohei Yoshida <kohei.yoshida@collabora.com>2014-07-14 15:24:19 -0400
committerKohei Yoshida <kohei.yoshida@collabora.com>2014-07-14 16:11:53 -0400
commitadf0d7b1fb8eed88f4fcd6d31662ae6f59d00812 (patch)
tree2e11b46ca8f9b93e3f18e2c74c22c40cd4b7bea1 /sc/source/filter/xcl97
parentd873fd9fa28a26c6f2b177d26dbbc76c9bd827a3 (diff)
Preserve the "end of list" flag for xls round-tripping.
This "end of list" flag determines whether the row insertion was an automatic insertion at the bottom. Calc doesn't use this at the moment but Excel uses it to differentiate a normal row insertion from an automatic one. Change-Id: I6b28669d816c54d1dc1e4c106918ba688415788d
Diffstat (limited to 'sc/source/filter/xcl97')
-rw-r--r--sc/source/filter/xcl97/XclExpChangeTrack.cxx17
-rw-r--r--sc/source/filter/xcl97/XclImpChangeTrack.cxx11
2 files changed, 21 insertions, 7 deletions
diff --git a/sc/source/filter/xcl97/XclExpChangeTrack.cxx b/sc/source/filter/xcl97/XclExpChangeTrack.cxx
index bb47f2aa6434..a307382cc87b 100644
--- a/sc/source/filter/xcl97/XclExpChangeTrack.cxx
+++ b/sc/source/filter/xcl97/XclExpChangeTrack.cxx
@@ -992,19 +992,31 @@ void XclExpChTrCellContent::SaveXml( XclExpXmlStream& rRevisionLogStrm )
pStream->endElement( XML_rcc );
}
+XclExpChTrInsert::XclExpChTrInsert( const XclExpChTrInsert& rCopy ) :
+ XclExpChTrAction(rCopy),
+ mbEndOfList(rCopy.mbEndOfList),
+ aRange(rCopy.aRange) {}
+
XclExpChTrInsert::XclExpChTrInsert(
const ScChangeAction& rAction,
const XclExpRoot& rRoot,
const XclExpChTrTabIdBuffer& rTabIdBuffer,
ScChangeTrack& rChangeTrack ) :
XclExpChTrAction( rAction, rRoot, rTabIdBuffer ),
+ mbEndOfList(false),
aRange( rAction.GetBigRange().MakeRange() )
{
nLength = 0x00000030;
switch( rAction.GetType() )
{
case SC_CAT_INSERT_COLS: nOpCode = EXC_CHTR_OP_INSCOL; break;
- case SC_CAT_INSERT_ROWS: nOpCode = EXC_CHTR_OP_INSROW; break;
+ case SC_CAT_INSERT_ROWS:
+ {
+ const ScChangeActionIns& rIns = static_cast<const ScChangeActionIns&>(rAction);
+ mbEndOfList = rIns.IsEndOfList();
+ nOpCode = EXC_CHTR_OP_INSROW;
+ }
+ break;
case SC_CAT_DELETE_COLS: nOpCode = EXC_CHTR_OP_DELCOL; break;
case SC_CAT_DELETE_ROWS: nOpCode = EXC_CHTR_OP_DELROW; break;
default:
@@ -1036,7 +1048,8 @@ XclExpChTrInsert::~XclExpChTrInsert()
void XclExpChTrInsert::SaveActionData( XclExpStream& rStrm ) const
{
WriteTabId( rStrm, aRange.aStart.Tab() );
- rStrm << (sal_uInt16) 0x0000;
+ sal_uInt16 nFlagVal = mbEndOfList ? 0x0001 : 0x0000;
+ rStrm << nFlagVal;
Write2DRange( rStrm, aRange );
rStrm << (sal_uInt32) 0x00000000;
}
diff --git a/sc/source/filter/xcl97/XclImpChangeTrack.cxx b/sc/source/filter/xcl97/XclImpChangeTrack.cxx
index b6e4180fc76b..f4532086d709 100644
--- a/sc/source/filter/xcl97/XclImpChangeTrack.cxx
+++ b/sc/source/filter/xcl97/XclImpChangeTrack.cxx
@@ -93,10 +93,10 @@ void XclImpChangeTrack::DoAcceptRejectAction( sal_uInt32 nFirst, sal_uInt32 nLas
DoAcceptRejectAction( pChangeTrack->GetAction( nIndex ) );
}
-void XclImpChangeTrack::DoInsertRange( const ScRange& rRange )
+void XclImpChangeTrack::DoInsertRange( const ScRange& rRange, bool bEndOfList )
{
sal_uInt32 nFirst = pChangeTrack->GetActionMax() + 1;
- pChangeTrack->AppendInsert( rRange );
+ pChangeTrack->AppendInsert(rRange, bEndOfList);
sal_uInt32 nLast = pChangeTrack->GetActionMax();
DoAcceptRejectAction( nFirst, nLast );
}
@@ -297,7 +297,8 @@ void XclImpChangeTrack::ReadChTrInsert()
ScRange aRange;
aRange.aStart.SetTab( ReadTabNum() );
aRange.aEnd.SetTab( aRange.aStart.Tab() );
- pStrm->Ignore( 2 );
+ sal_uInt16 nFlags = pStrm->ReaduInt16();
+ bool bEndOfList = (nFlags & 0x0001); // row auto-inserted at the bottom.
Read2DRange( aRange );
if( aRecHeader.nOpCode & EXC_CHTR_OP_COLFLAG )
@@ -314,7 +315,7 @@ void XclImpChangeTrack::ReadChTrInsert()
if( aRecHeader.nOpCode & EXC_CHTR_OP_DELFLAG )
DoDeleteRange( aRange );
else
- DoInsertRange( aRange );
+ DoInsertRange(aRange, bEndOfList);
}
}
}
@@ -426,7 +427,7 @@ void XclImpChangeTrack::ReadChTrInsertTab()
if( pStrm->IsValid() )
{
nTabIdCount++;
- DoInsertRange( ScRange( 0, 0, nTab, MAXCOL, MAXROW, nTab ) );
+ DoInsertRange(ScRange(0, 0, nTab, MAXCOL, MAXROW, nTab), false);
}
}
}