diff options
author | ALONSO Laurent <laurent.alonso@inria.fr> | 2019-04-05 14:30:28 +0200 |
---|---|---|
committer | ALONSO Laurent <laurent.alonso@inria.fr> | 2019-04-05 14:30:28 +0200 |
commit | 9c097a20c7a1a28593339b0d437ab5e813e04c33 (patch) | |
tree | 1904437c2090066353cd8aa1dc85513acce71c0e | |
parent | df6ec0bbd16189abd73fafe463a7a494d0479bdd (diff) |
.pages[all]: try to retrieve more complex groups...
Change-Id: I29057c1ffaf3a528e81b3ff11e9811981f453275
-rw-r--r-- | src/lib/IWORKCollector.cpp | 15 | ||||
-rw-r--r-- | src/lib/IWORKCollector.h | 5 | ||||
-rw-r--r-- | src/lib/PAGCollector.cpp | 12 |
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) |