parent
21e4b1dc1a
commit
803b80c808
@ -0,0 +1,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
|
||||
|
@ -0,0 +1,31 @@
|
||||
From bc03e5d29fbf3eb3f58b9f91c7e8c748239721ac Mon Sep 17 00:00:00 2001
|
||||
From: osnola <alonso@loria.fr>
|
||||
Date: Tue, 6 Jan 2015 15:48:18 +0100
|
||||
Subject: [PATCH 2/2] ClarisWors/AppleWorks[spreadsheet]: Oops, correct of a
|
||||
mistake...
|
||||
|
||||
---
|
||||
src/lib/ClarisWksDbaseContent.cxx | 6 +++---
|
||||
1 file changed, 3 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/src/lib/ClarisWksDbaseContent.cxx b/src/lib/ClarisWksDbaseContent.cxx
|
||||
index ea15544..e175c2e 100644
|
||||
--- a/src/lib/ClarisWksDbaseContent.cxx
|
||||
+++ b/src/lib/ClarisWksDbaseContent.cxx
|
||||
@@ -1413,10 +1413,10 @@ void ClarisWksDbaseContent::Record::updateFormulaCells(Vec2i const &removeDelta)
|
||||
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;
|
||||
}
|
||||
+ // revert to the basic cell type
|
||||
+ m_content.m_contentType=m_valueType;
|
||||
+ return;
|
||||
}
|
||||
}
|
||||
}
|
||||
--
|
||||
2.1.0
|
||||
|
Loading…
Reference in new issue