kbrown / rpms / libreoffice

Forked from rpms/libreoffice 2 years ago
Clone

Blame SOURCES/0042-Preserve-the-end-of-list-flag-for-xls-round-tripping.patch

f085be
From b7bd1b66287d9d337234ac1b9b50a1fafba7dd1e Mon Sep 17 00:00:00 2001
f085be
From: Kohei Yoshida <kohei.yoshida@collabora.com>
f085be
Date: Mon, 14 Jul 2014 15:24:19 -0400
f085be
Subject: [PATCH 042/137] Preserve the "end of list" flag for xls
f085be
 round-tripping.
f085be
f085be
This "end of list" flag determines whether the row insertion was an
f085be
automatic insertion at the bottom.  Calc doesn't use this at the moment
f085be
but Excel uses it to differentiate a normal row insertion from an
f085be
automatic one.
f085be
f085be
(cherry picked from commit adf0d7b1fb8eed88f4fcd6d31662ae6f59d00812)
f085be
Signed-off-by: Andras Timar <andras.timar@collabora.com>
f085be
f085be
Conflicts:
f085be
	sc/inc/chgtrack.hxx
f085be
	sc/source/filter/xcl97/XclExpChangeTrack.cxx
f085be
f085be
Change-Id: I6b28669d816c54d1dc1e4c106918ba688415788d
f085be
(cherry picked from commit 8fd0951429bfa00a054ebbc195a480f89af9f912)
f085be
Signed-off-by: Andras Timar <andras.timar@collabora.com>
f085be
---
f085be
 sc/inc/chgtrack.hxx                          | 26 ++++++++++------
f085be
 sc/source/core/tool/chgtrack.cxx             | 46 +++++++++++++++++-----------
f085be
 sc/source/filter/inc/XclExpChangeTrack.hxx   |  5 +--
f085be
 sc/source/filter/inc/XclImpChangeTrack.hxx   |  2 +-
f085be
 sc/source/filter/xcl97/XclExpChangeTrack.cxx | 17 ++++++++--
f085be
 sc/source/filter/xcl97/XclImpChangeTrack.cxx | 11 ++++---
f085be
 6 files changed, 68 insertions(+), 39 deletions(-)
f085be
f085be
diff --git a/sc/inc/chgtrack.hxx b/sc/inc/chgtrack.hxx
f085be
index 1f6ddcd..2e57437 100644
f085be
--- a/sc/inc/chgtrack.hxx
f085be
+++ b/sc/inc/chgtrack.hxx
f085be
@@ -402,7 +402,9 @@ class ScChangeActionIns : public ScChangeAction
f085be
 {
f085be
     friend class ScChangeTrack;
f085be
 
f085be
-                                ScChangeActionIns( const ScRange& rRange );
f085be
+    bool mbEndOfList; /// whether or not a row was auto-inserted at the bottom.
f085be
+
f085be
+    ScChangeActionIns( const ScRange& rRange, bool bEndOfList = false );
f085be
     virtual                     ~ScChangeActionIns();
f085be
 
f085be
     virtual void                AddContent( ScChangeActionContent* ) {}
f085be
@@ -413,17 +415,21 @@ class ScChangeActionIns : public ScChangeAction
f085be
     virtual const ScChangeTrack*    GetChangeTrack() const { return 0; }
f085be
 
f085be
 public:
f085be
-    ScChangeActionIns(const sal_uLong nActionNumber,
f085be
-            const ScChangeActionState eState,
f085be
-            const sal_uLong nRejectingNumber,
f085be
-            const ScBigRange& aBigRange,
f085be
-            const OUString& aUser,
f085be
-            const DateTime& aDateTime,
f085be
-            const OUString &sComment,
f085be
-            const ScChangeActionType eType); // only to use in the XML import
f085be
+    ScChangeActionIns(
f085be
+        const sal_uLong nActionNumber,
f085be
+        const ScChangeActionState eState,
f085be
+        const sal_uLong nRejectingNumber,
f085be
+        const ScBigRange& aBigRange,
f085be
+        const OUString& aUser,
f085be
+        const DateTime& aDateTime,
f085be
+        const OUString &sComment,
f085be
+        const ScChangeActionType eType,
f085be
+        bool bEndOfList = false );
f085be
 
f085be
     virtual void GetDescription(
f085be
         OUString& rStr, ScDocument* pDoc, bool bSplitRange = false, bool bWarning = true) const;
f085be
+
f085be
+    SC_DLLPUBLIC bool IsEndOfList() const;
f085be
 };
f085be
 
f085be
 //  ScChangeActionDel
f085be
@@ -1123,7 +1129,7 @@ public:
f085be
     // Only use the following two if there is no different solution! (Assign
f085be
     // string for NewValue or creation of a formula respectively)
f085be
 
f085be
-    SC_DLLPUBLIC void AppendInsert( const ScRange& );
f085be
+    SC_DLLPUBLIC void AppendInsert( const ScRange& rRange, bool bEndOfList = false );
f085be
 
f085be
                                 // pRefDoc may be NULL => no lookup of contents
f085be
                                 // => no generation of deleted contents
f085be
diff --git a/sc/source/core/tool/chgtrack.cxx b/sc/source/core/tool/chgtrack.cxx
f085be
index 1ebb30d..ff261ca 100644
f085be
--- a/sc/source/core/tool/chgtrack.cxx
f085be
+++ b/sc/source/core/tool/chgtrack.cxx
f085be
@@ -660,8 +660,9 @@ void ScChangeAction::AddDependent( sal_uLong nActionNumber,
f085be
 }
f085be
 
f085be
 //  ScChangeActionIns
f085be
-ScChangeActionIns::ScChangeActionIns( const ScRange& rRange )
f085be
-        : ScChangeAction( SC_CAT_NONE, rRange )
f085be
+ScChangeActionIns::ScChangeActionIns( const ScRange& rRange, bool bEndOfList ) :
f085be
+    ScChangeAction(SC_CAT_NONE, rRange),
f085be
+    mbEndOfList(bEndOfList)
f085be
 {
f085be
     if ( rRange.aStart.Col() == 0 && rRange.aEnd.Col() == MAXCOL )
f085be
     {
f085be
@@ -692,8 +693,10 @@ ScChangeActionIns::ScChangeActionIns(
f085be
     const sal_uLong nActionNumber, const ScChangeActionState eStateP,
f085be
     const sal_uLong nRejectingNumber, const ScBigRange& aBigRangeP,
f085be
     const OUString& aUserP, const DateTime& aDateTimeP,
f085be
-    const OUString& sComment, const ScChangeActionType eTypeP) :
f085be
-    ScChangeAction(eTypeP, aBigRangeP, nActionNumber, nRejectingNumber, eStateP, aDateTimeP, aUserP, sComment)
f085be
+    const OUString& sComment, const ScChangeActionType eTypeP,
f085be
+    bool bEndOfList ) :
f085be
+    ScChangeAction(eTypeP, aBigRangeP, nActionNumber, nRejectingNumber, eStateP, aDateTimeP, aUserP, sComment),
f085be
+    mbEndOfList(bEndOfList)
f085be
 {
f085be
 }
f085be
 
f085be
@@ -736,6 +739,11 @@ void ScChangeActionIns::GetDescription(
f085be
     }
f085be
 }
f085be
 
f085be
+bool ScChangeActionIns::IsEndOfList() const
f085be
+{
f085be
+    return mbEndOfList;
f085be
+}
f085be
+
f085be
 bool ScChangeActionIns::Reject( ScDocument* pDoc )
f085be
 {
f085be
     if ( !aBigRange.IsValid( pDoc ) )
f085be
@@ -2826,9 +2834,9 @@ ScChangeActionContent* ScChangeTrack::AppendContentOnTheFly(
f085be
     return pAct;
f085be
 }
f085be
 
f085be
-void ScChangeTrack::AppendInsert( const ScRange& rRange )
f085be
+void ScChangeTrack::AppendInsert( const ScRange& rRange, bool bEndOfList )
f085be
 {
f085be
-    ScChangeActionIns* pAct = new ScChangeActionIns( rRange );
f085be
+    ScChangeActionIns* pAct = new ScChangeActionIns(rRange, bEndOfList);
f085be
     Append( pAct );
f085be
 }
f085be
 
f085be
@@ -4458,18 +4466,20 @@ ScChangeTrack* ScChangeTrack::Clone( ScDocument* pDocument ) const
f085be
             case SC_CAT_INSERT_COLS:
f085be
             case SC_CAT_INSERT_ROWS:
f085be
             case SC_CAT_INSERT_TABS:
f085be
-                {
f085be
-                    pClonedAction = new ScChangeActionIns(
f085be
-                        pAction->GetActionNumber(),
f085be
-                        pAction->GetState(),
f085be
-                        pAction->GetRejectAction(),
f085be
-                        pAction->GetBigRange(),
f085be
-                        pAction->GetUser(),
f085be
-                        pAction->GetDateTimeUTC(),
f085be
-                        pAction->GetComment(),
f085be
-                        pAction->GetType() );
f085be
-                }
f085be
-                break;
f085be
+            {
f085be
+                bool bEndOfList = static_cast<const ScChangeActionIns*>(pAction)->IsEndOfList();
f085be
+                pClonedAction = new ScChangeActionIns(
f085be
+                    pAction->GetActionNumber(),
f085be
+                    pAction->GetState(),
f085be
+                    pAction->GetRejectAction(),
f085be
+                    pAction->GetBigRange(),
f085be
+                    pAction->GetUser(),
f085be
+                    pAction->GetDateTimeUTC(),
f085be
+                    pAction->GetComment(),
f085be
+                    pAction->GetType(),
f085be
+                    bEndOfList );
f085be
+            }
f085be
+            break;
f085be
             case SC_CAT_DELETE_COLS:
f085be
             case SC_CAT_DELETE_ROWS:
f085be
             case SC_CAT_DELETE_TABS:
f085be
diff --git a/sc/source/filter/inc/XclExpChangeTrack.hxx b/sc/source/filter/inc/XclExpChangeTrack.hxx
f085be
index 72b7066..c7ee389 100644
f085be
--- a/sc/source/filter/inc/XclExpChangeTrack.hxx
f085be
+++ b/sc/source/filter/inc/XclExpChangeTrack.hxx
f085be
@@ -516,11 +516,12 @@ public:
f085be
 
f085be
 class XclExpChTrInsert : public XclExpChTrAction
f085be
 {
f085be
+    bool mbEndOfList;
f085be
+
f085be
 protected:
f085be
     ScRange                     aRange;
f085be
 
f085be
-                                XclExpChTrInsert( const XclExpChTrInsert& rCopy ) :
f085be
-                                    XclExpChTrAction( rCopy ), aRange( rCopy.aRange ) {}
f085be
+    XclExpChTrInsert( const XclExpChTrInsert& rCopy );
f085be
 
f085be
     virtual void                SaveActionData( XclExpStream& rStrm ) const;
f085be
     virtual void                PrepareSaveAction( XclExpStream& rStrm ) const;
f085be
diff --git a/sc/source/filter/inc/XclImpChangeTrack.hxx b/sc/source/filter/inc/XclImpChangeTrack.hxx
f085be
index ffce967..c1b06d6 100644
f085be
--- a/sc/source/filter/inc/XclImpChangeTrack.hxx
f085be
+++ b/sc/source/filter/inc/XclImpChangeTrack.hxx
f085be
@@ -73,7 +73,7 @@ private:
f085be
     void                        DoAcceptRejectAction( ScChangeAction* pAction );
f085be
     void                        DoAcceptRejectAction( sal_uInt32 nFirst, sal_uInt32 nLast );
f085be
 
f085be
-    void                        DoInsertRange( const ScRange& rRange );
f085be
+    void DoInsertRange( const ScRange& rRange, bool bEndOfList );
f085be
     void                        DoDeleteRange( const ScRange& rRange );
f085be
 
f085be
     inline sal_uInt8            LookAtuInt8();
f085be
diff --git a/sc/source/filter/xcl97/XclExpChangeTrack.cxx b/sc/source/filter/xcl97/XclExpChangeTrack.cxx
f085be
index aed0322..fe27e92 100644
f085be
--- a/sc/source/filter/xcl97/XclExpChangeTrack.cxx
f085be
+++ b/sc/source/filter/xcl97/XclExpChangeTrack.cxx
f085be
@@ -1118,7 +1118,10 @@ void XclExpChTrCellContent::SaveXml( XclExpXmlStream& rRevisionLogStrm )
f085be
     pStream->endElement( XML_rcc );
f085be
 }
f085be
 
f085be
-//___________________________________________________________________
f085be
+XclExpChTrInsert::XclExpChTrInsert( const XclExpChTrInsert& rCopy ) :
f085be
+    XclExpChTrAction(rCopy),
f085be
+    mbEndOfList(rCopy.mbEndOfList),
f085be
+    aRange(rCopy.aRange) {}
f085be
 
f085be
 XclExpChTrInsert::XclExpChTrInsert(
f085be
         const ScChangeAction& rAction,
f085be
@@ -1126,13 +1129,20 @@ XclExpChTrInsert::XclExpChTrInsert(
f085be
         const XclExpChTrTabIdBuffer& rTabIdBuffer,
f085be
         ScChangeTrack& rChangeTrack ) :
f085be
     XclExpChTrAction( rAction, rRoot, rTabIdBuffer ),
f085be
+    mbEndOfList(false),
f085be
     aRange( rAction.GetBigRange().MakeRange() )
f085be
 {
f085be
     nLength = 0x00000030;
f085be
     switch( rAction.GetType() )
f085be
     {
f085be
         case SC_CAT_INSERT_COLS:    nOpCode = EXC_CHTR_OP_INSCOL;   break;
f085be
-        case SC_CAT_INSERT_ROWS:    nOpCode = EXC_CHTR_OP_INSROW;   break;
f085be
+        case SC_CAT_INSERT_ROWS:
f085be
+        {
f085be
+            const ScChangeActionIns& rIns = static_cast<const ScChangeActionIns&>(rAction);
f085be
+            mbEndOfList = rIns.IsEndOfList();
f085be
+            nOpCode = EXC_CHTR_OP_INSROW;
f085be
+        }
f085be
+        break;
f085be
         case SC_CAT_DELETE_COLS:    nOpCode = EXC_CHTR_OP_DELCOL;   break;
f085be
         case SC_CAT_DELETE_ROWS:    nOpCode = EXC_CHTR_OP_DELROW;   break;
f085be
         default:
f085be
@@ -1164,7 +1174,8 @@ XclExpChTrInsert::~XclExpChTrInsert()
f085be
 void XclExpChTrInsert::SaveActionData( XclExpStream& rStrm ) const
f085be
 {
f085be
     WriteTabId( rStrm, aRange.aStart.Tab() );
f085be
-    rStrm   << (sal_uInt16) 0x0000;
f085be
+    sal_uInt16 nFlagVal = mbEndOfList ? 0x0001 : 0x0000;
f085be
+    rStrm << nFlagVal;
f085be
     Write2DRange( rStrm, aRange );
f085be
     rStrm   << (sal_uInt32) 0x00000000;
f085be
 }
f085be
diff --git a/sc/source/filter/xcl97/XclImpChangeTrack.cxx b/sc/source/filter/xcl97/XclImpChangeTrack.cxx
f085be
index 58c2540..cf1babc 100644
f085be
--- a/sc/source/filter/xcl97/XclImpChangeTrack.cxx
f085be
+++ b/sc/source/filter/xcl97/XclImpChangeTrack.cxx
f085be
@@ -95,10 +95,10 @@ void XclImpChangeTrack::DoAcceptRejectAction( sal_uInt32 nFirst, sal_uInt32 nLas
f085be
         DoAcceptRejectAction( pChangeTrack->GetAction( nIndex ) );
f085be
 }
f085be
 
f085be
-void XclImpChangeTrack::DoInsertRange( const ScRange& rRange )
f085be
+void XclImpChangeTrack::DoInsertRange( const ScRange& rRange, bool bEndOfList )
f085be
 {
f085be
     sal_uInt32 nFirst = pChangeTrack->GetActionMax() + 1;
f085be
-    pChangeTrack->AppendInsert( rRange );
f085be
+    pChangeTrack->AppendInsert(rRange, bEndOfList);
f085be
     sal_uInt32 nLast = pChangeTrack->GetActionMax();
f085be
     DoAcceptRejectAction( nFirst, nLast );
f085be
 }
f085be
@@ -299,7 +299,8 @@ void XclImpChangeTrack::ReadChTrInsert()
f085be
         ScRange aRange;
f085be
         aRange.aStart.SetTab( ReadTabNum() );
f085be
         aRange.aEnd.SetTab( aRange.aStart.Tab() );
f085be
-        pStrm->Ignore( 2 );
f085be
+        sal_uInt16 nFlags = pStrm->ReaduInt16();
f085be
+        bool bEndOfList = (nFlags & 0x0001); // row auto-inserted at the bottom.
f085be
         Read2DRange( aRange );
f085be
 
f085be
         if( aRecHeader.nOpCode & EXC_CHTR_OP_COLFLAG )
f085be
@@ -316,7 +317,7 @@ void XclImpChangeTrack::ReadChTrInsert()
f085be
             if( aRecHeader.nOpCode & EXC_CHTR_OP_DELFLAG )
f085be
                 DoDeleteRange( aRange );
f085be
             else
f085be
-                DoInsertRange( aRange );
f085be
+                DoInsertRange(aRange, bEndOfList);
f085be
         }
f085be
     }
f085be
 }
f085be
@@ -428,7 +429,7 @@ void XclImpChangeTrack::ReadChTrInsertTab()
f085be
         if( pStrm->IsValid() )
f085be
         {
f085be
             nTabIdCount++;
f085be
-            DoInsertRange( ScRange( 0, 0, nTab, MAXCOL, MAXROW, nTab ) );
f085be
+            DoInsertRange(ScRange(0, 0, nTab, MAXCOL, MAXROW, nTab), false);
f085be
         }
f085be
     }
f085be
 }
f085be
-- 
f085be
1.9.3
f085be