summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorALONSO Laurent <laurent.alonso@inria.fr>2019-04-05 14:30:28 +0200
committerALONSO Laurent <laurent.alonso@inria.fr>2019-04-05 14:30:28 +0200
commit9c097a20c7a1a28593339b0d437ab5e813e04c33 (patch)
tree1904437c2090066353cd8aa1dc85513acce71c0e
parentdf6ec0bbd16189abd73fafe463a7a494d0479bdd (diff)
.pages[all]: try to retrieve more complex groups...
Change-Id: I29057c1ffaf3a528e81b3ff11e9811981f453275
-rw-r--r--src/lib/IWORKCollector.cpp15
-rw-r--r--src/lib/IWORKCollector.h5
-rw-r--r--src/lib/PAGCollector.cpp12
3 files changed, 22 insertions, 10 deletions
diff --git a/src/lib/IWORKCollector.cpp b/src/lib/IWORKCollector.cpp
index 794b462..26b0089 100644
--- a/src/lib/IWORKCollector.cpp
+++ b/src/lib/IWORKCollector.cpp
@@ -213,6 +213,7 @@ IWORKCollector::IWORKCollector(IWORKDocumentInterface *const document)
, m_metadata()
, m_accumulateTransform(true)
, m_groupLevel(0)
+ , m_groupOpenLevel(0)
{
}
@@ -220,7 +221,7 @@ IWORKCollector::~IWORKCollector()
{
assert(m_levelStack.empty());
assert(m_stylesheetStack.empty());
- assert(0 == m_groupLevel);
+ assert(0 == m_groupLevel && 0 == m_groupOpenLevel);
assert(!m_currentPath);
assert(!m_currentText);
@@ -526,7 +527,7 @@ void IWORKCollector::endDocument()
{
assert(m_levelStack.empty());
assert(m_pathStack.empty());
- assert(0 == m_groupLevel);
+ assert(0 == m_groupLevel && 0 == m_groupOpenLevel);
assert(!m_currentPath);
assert(!m_currentText);
@@ -567,8 +568,8 @@ void IWORKCollector::openGroup()
}
assert(m_groupLevel > 0);
- if (!m_inAttachments)
- m_outputManager.getCurrent().addOpenGroup(librevenge::RVNGPropertyList());
+ m_outputManager.getCurrent().addOpenGroup(librevenge::RVNGPropertyList());
+ ++m_groupOpenLevel;
}
void IWORKCollector::closeGroup()
@@ -578,9 +579,9 @@ void IWORKCollector::closeGroup()
m_recorder->closeGroup();
return;
}
- assert(m_groupLevel > 0);
- if (!m_inAttachments)
- m_outputManager.getCurrent().addCloseGroup();
+ assert(m_groupLevel > 0 && m_groupOpenLevel > 0);
+ m_outputManager.getCurrent().addCloseGroup();
+ --m_groupOpenLevel;
}
std::shared_ptr<IWORKTable> IWORKCollector::createTable(const IWORKTableNameMapPtr_t &tableNameMap, const IWORKLanguageManager &langManager) const
diff --git a/src/lib/IWORKCollector.h b/src/lib/IWORKCollector.h
index e6cd135..3b6eb8a 100644
--- a/src/lib/IWORKCollector.h
+++ b/src/lib/IWORKCollector.h
@@ -108,6 +108,10 @@ public:
// really add a group in the final file
void openGroup();
void closeGroup();
+ bool getOpenGroupLevel() const
+ {
+ return m_groupOpenLevel;
+ };
void startLevel();
void endLevel();
@@ -192,6 +196,7 @@ private:
bool m_accumulateTransform;
int m_groupLevel;
+ int m_groupOpenLevel;
};
} // namespace libetonyek
diff --git a/src/lib/PAGCollector.cpp b/src/lib/PAGCollector.cpp
index 8faa7e1..a3ac5e2 100644
--- a/src/lib/PAGCollector.cpp
+++ b/src/lib/PAGCollector.cpp
@@ -226,6 +226,10 @@ void PAGCollector::drawTable()
{
assert(bool(m_currentTable));
assert(!m_levelStack.empty());
+ // FIXME: in .odt files, table can not appear in group
+ int prevGroupLevel=getOpenGroupLevel();
+ for (int level=0; level<prevGroupLevel; ++level)
+ closeGroup();
RVNGPropertyList frameProps;
librevenge::RVNGPropertyList props;
@@ -260,18 +264,20 @@ void PAGCollector::drawTable()
fillWrapProps(m_currentTable->getStyle(), frameProps, m_currentTable->getOrder());
}
- if (m_inAttachments)
+ if (m_inAttachments && !prevGroupLevel)
m_currentTable->draw(props, m_outputManager.getCurrent(), true);
else
{
- /* in Oasis v1.2, we can add the table directly in a frame, but
- LibreOffice does not display it, so ...*/
+ frameProps.insert("draw:fill", "none");
+ frameProps.insert("draw:stroke", "none");
getOutputManager().getCurrent().addOpenFrame(frameProps);
getOutputManager().getCurrent().addStartTextObject(RVNGPropertyList());
m_currentTable->draw(props, m_outputManager.getCurrent(), true);
getOutputManager().getCurrent().addEndTextObject();
getOutputManager().getCurrent().addCloseFrame();
}
+ for (int level=0; level<prevGroupLevel; ++level)
+ openGroup();
}
void PAGCollector::drawShape(const IWORKShapePtr_t &shape)