diff options
author | Fridrich Štrba <fridrich.strba@bluewin.ch> | 2011-11-10 13:12:20 +0100 |
---|---|---|
committer | Fridrich Štrba <fridrich.strba@bluewin.ch> | 2011-11-10 13:12:20 +0100 |
commit | 80ce9032a98cfeb434fdf23a8a99973eb8754c97 (patch) | |
tree | fa556cb55a339a3b58fa10b989baa5b92971a470 | |
parent | dc4fb1d4c5e37272c024047dd383ea1b74cc45fc (diff) |
And now the text fields should be replaced (not in the right format though)
-rw-r--r-- | src/lib/VSDXContentCollector.cpp | 28 | ||||
-rw-r--r-- | src/lib/VSDXContentCollector.h | 7 | ||||
-rw-r--r-- | src/lib/VSDXFieldList.cpp | 30 | ||||
-rw-r--r-- | src/lib/VSDXFieldList.h | 5 |
4 files changed, 26 insertions, 44 deletions
diff --git a/src/lib/VSDXContentCollector.cpp b/src/lib/VSDXContentCollector.cpp index cb2c47d..77d418f 100644 --- a/src/lib/VSDXContentCollector.cpp +++ b/src/lib/VSDXContentCollector.cpp @@ -65,8 +65,8 @@ libvisio::VSDXContentCollector::VSDXContentCollector( m_currentPageNumber(0), m_shapeOutputDrawing(0), m_shapeOutputText(0), m_pageOutputDrawing(), m_pageOutputText(), m_documentPageShapeOrders(documentPageShapeOrders), m_pageShapeOrder(documentPageShapeOrders[0]), m_isFirstGeometry(true), - m_NURBSData(), m_polylineData(), m_textStream(), m_names(), m_fields(), m_textFormat(VSD_TEXT_ANSI), - m_charFormats(), m_paraFormats(), m_textBlockStyle(), + m_NURBSData(), m_polylineData(), m_textStream(), m_names(), m_fields(), m_fieldIndex(0), + m_textFormat(VSD_TEXT_ANSI), m_charFormats(), m_paraFormats(), m_textBlockStyle(), m_defaultCharStyle(), m_defaultParaStyle(), m_styles(styles), m_stencils(stencils), m_stencilShape(0), m_isStencilStarted(false), m_currentGeometryCount(0), m_backgroundPageID(0xffffffff), m_currentPageID(0), m_currentPage(), m_pages(), @@ -1611,11 +1611,7 @@ void libvisio::VSDXContentCollector::collectShape(unsigned id, unsigned level, u m_names.push_back(nameString); } - for (std::vector<VSDXFieldListElement *>::iterator iterField = m_fields.begin(); iterField != m_fields.end(); iterField++) - if (*iterField) - delete (*iterField); - m_fields.clear(); - m_fields = m_stencilShape->m_fields.getVector(); + m_fields = m_stencilShape->m_fields; if (m_stencilShape->m_lineStyleId) lineStyleFromStyleSheet(m_stencilShape->m_lineStyleId); @@ -1660,6 +1656,7 @@ void libvisio::VSDXContentCollector::collectShape(unsigned id, unsigned level, u } m_currentGeometryCount = 0; + m_fieldIndex = 0; } void libvisio::VSDXContentCollector::collectUnhandledChunk(unsigned /* id */, unsigned level) @@ -1767,6 +1764,7 @@ void libvisio::VSDXContentCollector::collectNameList(unsigned /*id*/, unsigned l void libvisio::VSDXContentCollector::_convertDataToString(WPXString &result, const WPXBinaryData &data, TextFormat format) { + m_fieldIndex = 0; WPXInputStream *pStream = const_cast<WPXInputStream *>(data.getDataStream()); if (format == VSD_TEXT_ANSI) { @@ -1861,30 +1859,32 @@ void libvisio::VSDXContentCollector::fillStyleFromStyleSheet(const VSDXFillStyle void libvisio::VSDXContentCollector::collectFieldList(unsigned id, unsigned level, const std::vector<unsigned> &fieldsOrder) { _handleLevelChange(level); - for (std::vector<VSDXFieldListElement *>::iterator iterField = m_fields.begin(); iterField != m_fields.end(); iterField++) - if (*iterField) - delete (*iterField); m_fields.clear(); + m_fields.setElementsOrder(fieldsOrder); } void libvisio::VSDXContentCollector::collectTextField(unsigned id, unsigned level, unsigned nameId) { _handleLevelChange(level); + m_fields.addTextField(id, level, nameId); } void libvisio::VSDXContentCollector::collectNumericField(unsigned id, unsigned level, unsigned format, double number) { _handleLevelChange(level); + m_fields.addNumericField(id, level, format, number); } void libvisio::VSDXContentCollector::collectDatetimeField(unsigned id, unsigned level, unsigned format, unsigned long timeValue) { _handleLevelChange(level); + m_fields.addDatetimeField(id, level, format, timeValue); } void libvisio::VSDXContentCollector::collectEmptyField(unsigned id, unsigned level) { _handleLevelChange(level); + m_fields.addEmptyField(id, level); } @@ -1919,7 +1919,6 @@ void libvisio::VSDXContentCollector::_handleLevelChange(unsigned level) if (m_textStream.size()) _flushText(); m_isShapeStarted = false; - } m_originalX = 0.0; m_originalY = 0.0; @@ -1989,6 +1988,7 @@ void libvisio::VSDXContentCollector::_appendUTF16LE(WPXString &text, WPXInputStr uint16_t high_surrogate = 0; bool fail = false; uint32_t ucs4Character = 0; + uint16_t character = 0; while (true) { if (input->atEOS()) @@ -1996,8 +1996,10 @@ void libvisio::VSDXContentCollector::_appendUTF16LE(WPXString &text, WPXInputStr fail = true; break; } - uint16_t character = readU16(input); - if (character >= 0xdc00 && character < 0xe000) /* low surrogate */ + character = readU16(input); + if (character == 0xfffc) + text.append(m_fields.getElement(m_fieldIndex++)->getString(m_names).cstr()); + else if (character >= 0xdc00 && character < 0xe000) /* low surrogate */ { if (high_surrogate) { diff --git a/src/lib/VSDXContentCollector.h b/src/lib/VSDXContentCollector.h index 47d1743..03c192f 100644 --- a/src/lib/VSDXContentCollector.h +++ b/src/lib/VSDXContentCollector.h @@ -62,10 +62,6 @@ public: virtual ~VSDXContentCollector() { if (m_txtxform) delete(m_txtxform); - for (std::vector<VSDXFieldListElement *>::iterator iterField = m_fields.begin(); iterField != m_fields.end(); iterField++) - if (*iterField) - delete (*iterField); - m_fields.clear(); }; void collectEllipticalArcTo(unsigned id, unsigned level, double x3, double y3, double x2, double y2, double angle, double ecc); @@ -229,7 +225,8 @@ private: std::map<unsigned, PolylineData> m_polylineData; WPXBinaryData m_textStream; std::vector<WPXString> m_names; - std::vector<VSDXFieldListElement *> m_fields; + VSDXFieldList m_fields; + unsigned m_fieldIndex; TextFormat m_textFormat; std::vector<VSDXCharStyle> m_charFormats; std::vector<VSDXParaStyle> m_paraFormats; diff --git a/src/lib/VSDXFieldList.cpp b/src/lib/VSDXFieldList.cpp index e1c8381..56ec296 100644 --- a/src/lib/VSDXFieldList.cpp +++ b/src/lib/VSDXFieldList.cpp @@ -200,30 +200,6 @@ libvisio::VSDXFieldList &libvisio::VSDXFieldList::operator=(const libvisio::VSDX return *this; } -std::vector<libvisio::VSDXFieldListElement *> libvisio::VSDXFieldList::getVector() const -{ - std::vector<libvisio::VSDXFieldListElement *> vec; - if (!empty()) - { - std::map<unsigned, VSDXFieldListElement *>::const_iterator iter; - if (m_elementsOrder.size()) - { - for (unsigned i = 0; i < m_elementsOrder.size(); i++) - { - iter = m_elements.find(m_elementsOrder[i]); - if (iter != m_elements.end()) - vec.push_back(iter->second->clone()); - } - } - else - { - for (iter = m_elements.begin(); iter != m_elements.end(); iter++) - vec.push_back(iter->second->clone()); - } - } - return vec; -} - libvisio::VSDXFieldList::~VSDXFieldList() { clear(); @@ -260,6 +236,7 @@ void libvisio::VSDXFieldList::handle(VSDXCollector *collector) { if (empty()) return; + std::map<unsigned, VSDXFieldListElement *>::iterator iter; if (m_elementsOrder.size()) { @@ -287,7 +264,10 @@ void libvisio::VSDXFieldList::clear() libvisio::VSDXFieldListElement *libvisio::VSDXFieldList::getElement(unsigned index) { - std::map<unsigned, VSDXFieldListElement *>::iterator iter = m_elements.find(index); + if (m_elementsOrder.size() > index) + index = m_elementsOrder[index]; + + std::map<unsigned, VSDXFieldListElement *>::const_iterator iter = m_elements.find(index); if (iter != m_elements.end()) return iter->second; else diff --git a/src/lib/VSDXFieldList.h b/src/lib/VSDXFieldList.h index b33a8bb..51ce2d1 100644 --- a/src/lib/VSDXFieldList.h +++ b/src/lib/VSDXFieldList.h @@ -61,7 +61,6 @@ public: VSDXFieldList(const VSDXFieldList &fieldList); ~VSDXFieldList(); VSDXFieldList &operator=(const VSDXFieldList &fieldList); - std::vector<VSDXFieldListElement *> getVector() const; void setElementsOrder(const std::vector<unsigned> &m_elementsOrder); void addTextField(unsigned id, unsigned level, unsigned nameId); void addNumericField(unsigned id, unsigned level, unsigned format, double number); @@ -69,6 +68,10 @@ public: void addEmptyField(unsigned id, unsigned level); void handle(VSDXCollector *collector); void clear(); + unsigned long size() const + { + return (unsigned long)m_elements.size(); + } bool empty() const { return (!m_elements.size()); |