summaryrefslogtreecommitdiffstats
path: root/external/libmwaw/0001-ClarisWorks-AppleWorks-spreadsheet-do-not-remove-fir.patch
blob: 0d79446c79104775dbf9e0df62dece567e5bc67b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
From c092ac823e50083c04464565365ddd4af71f8c89 Mon Sep 17 00:00:00 2001
From: osnola <alonso@loria.fr>
Date: Tue, 6 Jan 2015 15:39:54 +0100
Subject: [PATCH 1/2] ClarisWorks/AppleWorks[spreadsheet]: do not remove first
 empty rows and/or columns in the main spreadsheet   + if we remove some first
 rows/columns in a embedded spreadsheet, update the cells present in
 formula...

---
 src/lib/ClarisWksDbaseContent.cxx | 29 +++++++++++++++++++++++++++++
 src/lib/ClarisWksDbaseContent.hxx |  3 ++-
 src/lib/ClarisWksSpreadsheet.cxx  |  5 +++++
 3 files changed, 36 insertions(+), 1 deletion(-)

diff --git a/src/lib/ClarisWksDbaseContent.cxx b/src/lib/ClarisWksDbaseContent.cxx
index 7226af1..ea15544 100644
--- a/src/lib/ClarisWksDbaseContent.cxx
+++ b/src/lib/ClarisWksDbaseContent.cxx
@@ -1393,4 +1393,33 @@ bool ClarisWksDbaseContent::readFormula(Vec2i const &cPos, long endPos, std::vec
 
   return true;
 }
+
+////////////////////////////////////////////////////////////
+//
+////////////////////////////////////////////////////////////
+void ClarisWksDbaseContent::Record::updateFormulaCells(Vec2i const &removeDelta)
+{
+  if (m_content.m_contentType!=MWAWCellContent::C_FORMULA)
+    return;
+  std::vector<MWAWCellContent::FormulaInstruction> &formula=m_content.m_formula;
+  for (size_t i=0; i<formula.size(); ++i) {
+    MWAWCellContent::FormulaInstruction &instr=formula[i];
+    int numCell=instr.m_type==MWAWCellContent::FormulaInstruction::F_Cell ? 1 :
+                instr.m_type==MWAWCellContent::FormulaInstruction::F_CellList ? 2 : 0;
+    for (int c=0; c<numCell; ++c) {
+      instr.m_position[c]-=removeDelta;
+      if (instr.m_position[c][0]<0 || instr.m_position[c][1]<0) {
+        static bool first=true;
+        if (first) {
+          MWAW_DEBUG_MSG(("ClarisWksDbaseContent::Record::updateFormulaCells: some cell's positions are bad, remove formula\n"));
+          first=false;
+          // revert to the basic cell type
+          m_content.m_contentType=m_valueType;
+          return;
+        }
+      }
+    }
+  }
+}
+
 // vim: set filetype=cpp tabstop=2 shiftwidth=2 cindent autoindent smartindent noexpandtab:
diff --git a/src/lib/ClarisWksDbaseContent.hxx b/src/lib/ClarisWksDbaseContent.hxx
index 4894d31..8a40b31 100644
--- a/src/lib/ClarisWksDbaseContent.hxx
+++ b/src/lib/ClarisWksDbaseContent.hxx
@@ -83,7 +83,8 @@ public:
       m_content(), m_valueType(MWAWCellContent::C_UNKNOWN), m_hasNaNValue(false), m_backgroundColor(MWAWColor::white()), m_font(3,9), m_borders(0)
     {
     }
-
+    //! update the formula cell (removing delta to each position)
+    void updateFormulaCells(Vec2i const &removeDelta);
     //! the style if known
     int m_style;
     //! the format
diff --git a/src/lib/ClarisWksSpreadsheet.cxx b/src/lib/ClarisWksSpreadsheet.cxx
index c6b9f3d..60eb293 100644
--- a/src/lib/ClarisWksSpreadsheet.cxx
+++ b/src/lib/ClarisWksSpreadsheet.cxx
@@ -455,6 +455,8 @@ bool ClarisWksSpreadsheet::sendSpreadsheet(int zId, MWAWListenerPtr listener)
     MWAW_DEBUG_MSG(("ClarisWksSpreadsheet::sendSpreadsheet: can not find content\n"));
     return false;
   }
+  if (m_parserState->m_kind==MWAWDocument::MWAW_K_SPREADSHEET && zId==1)
+    minData=Vec2i(0,0);
   std::vector<float> colSize((size_t)(maxData[0]-minData[0]+1),72);
   for (int c=minData[0], fC=0; c <= maxData[0]; ++c, ++fC) {
     if (c>=0 && c < int(sheet.m_colWidths.size()))
@@ -462,6 +464,7 @@ bool ClarisWksSpreadsheet::sendSpreadsheet(int zId, MWAWListenerPtr listener)
   }
   sheetListener->openSheet(colSize, librevenge::RVNG_POINT);
   MWAWInputStreamPtr &input= m_parserState->m_input;
+  bool recomputeCellPosition=(minData!=Vec2i(0,0));
   for (int r=minData[1], fR=0; r <= maxData[1]; ++r, ++fR) {
     if (sheet.m_rowHeightMap.find(r)!=sheet.m_rowHeightMap.end())
       sheetListener->openSheetRow((float)sheet.m_rowHeightMap.find(r)->second, librevenge::RVNG_POINT);
@@ -478,6 +481,8 @@ bool ClarisWksSpreadsheet::sendSpreadsheet(int zId, MWAWListenerPtr listener)
       // change the reference date from 1/1/1904 to 1/1/1900
       if (rec.m_format.m_format==MWAWCell::F_DATE && rec.m_content.isValueSet())
         rec.m_content.setValue(rec.m_content.m_value+1460);
+      if (recomputeCellPosition)
+        rec.updateFormulaCells(minData);
       if (rec.m_borders) {
         int wh=0;
         for (int i=0, bit=1; i < 4; ++i, bit*=2) {
-- 
2.1.0