diff options
author | Kohei Yoshida <kohei.yoshida@gmail.com> | 2012-11-09 22:10:54 -0500 |
---|---|---|
committer | Kohei Yoshida <kohei.yoshida@gmail.com> | 2012-11-28 13:28:29 -0500 |
commit | f10c5f33c17093bac8dd09b1a3b6ea39bdb6020c (patch) | |
tree | 367a5d7b5b3f9344878707c3b4a86ba10d4015a2 /sc/source/ui/xmlsource | |
parent | eb85e45358d641a9beb246a97c3144b3d4a591ee (diff) |
Register range links to orcus_xml too.
But range links fail to import. Looks like sheet names are corrupted.
I need to debug this...
Change-Id: If2aeb3b81db65749f05edfbdd2f3388be4f2539c
Diffstat (limited to 'sc/source/ui/xmlsource')
-rw-r--r-- | sc/source/ui/xmlsource/xmlsourcedlg.cxx | 75 |
1 files changed, 64 insertions, 11 deletions
diff --git a/sc/source/ui/xmlsource/xmlsourcedlg.cxx b/sc/source/ui/xmlsource/xmlsourcedlg.cxx index 7821b9b14b68..62d2f4070bd8 100644 --- a/sc/source/ui/xmlsource/xmlsourcedlg.cxx +++ b/sc/source/ui/xmlsource/xmlsourcedlg.cxx @@ -414,26 +414,79 @@ bool ScXMLSourceDlg::IsChildrenDirty(SvTreeListEntry* pEntry) const return false; } +namespace { + +/** + * Pick only the leaf elements. + */ +void getFieldLinks(ScOrcusImportXMLParam::RangeLink& rRangeLink, const SvTreeListBox& rTree, const SvTreeListEntry& rEntry) +{ + const SvTreeListEntries& rChildren = rEntry.GetChildEntries(); + if (rChildren.empty()) + // No more children. We're done. + return; + + SvTreeListEntries::const_iterator it = rChildren.begin(), itEnd = rChildren.end(); + for (; it != itEnd; ++it) + { + const SvTreeListEntry& rChild = *it; + OUString aPath = getXPath(rTree, rChild); + + const ScOrcusXMLTreeParam::EntryData* pUserData = ScOrcusXMLTreeParam::getUserData(rChild); + fprintf(stdout, "getFieldLinks: path = '%s' leaf = %d\n", rtl::OUStringToOString(aPath, RTL_TEXTENCODING_UTF8).getStr(), pUserData->mbLeafNode); + if (pUserData && pUserData->mbLeafNode) + { + if (!aPath.isEmpty()) + // XPath should never be empty anyway, but it won't hurt to check... + rRangeLink.maFieldPaths.push_back(rtl::OUStringToOString(aPath, RTL_TEXTENCODING_UTF8)); + } + + // Walk recursively. + getFieldLinks(rRangeLink, rTree, rChild); + } +} + +} + void ScXMLSourceDlg::OkPressed() { // Begin import. ScOrcusImportXMLParam aParam; - std::set<const SvTreeListEntry*>::const_iterator it = maCellLinks.begin(), itEnd = maCellLinks.end(); - for (; it != itEnd; ++it) + // Convert single cell links. { - const SvTreeListEntry& rEntry = **it; - OUString aPath = getXPath(maLbTree, rEntry); - const ScOrcusXMLTreeParam::EntryData* pUserData = ScOrcusXMLTreeParam::getUserData(rEntry); - ScAddress aPos = pUserData->maLinkedPos; - - aParam.maCellLinks.push_back( - ScOrcusImportXMLParam::CellLink( - aPos, rtl::OUStringToOString(aPath, RTL_TEXTENCODING_UTF8))); + std::set<const SvTreeListEntry*>::const_iterator it = maCellLinks.begin(), itEnd = maCellLinks.end(); + for (; it != itEnd; ++it) + { + const SvTreeListEntry& rEntry = **it; + OUString aPath = getXPath(maLbTree, rEntry); + const ScOrcusXMLTreeParam::EntryData* pUserData = ScOrcusXMLTreeParam::getUserData(rEntry); + + aParam.maCellLinks.push_back( + ScOrcusImportXMLParam::CellLink( + pUserData->maLinkedPos, rtl::OUStringToOString(aPath, RTL_TEXTENCODING_UTF8))); + } } - // TODO: Process range links. + // Convert range links. For now, an element with range link takes all its + // child elements as its fields. + { + std::set<const SvTreeListEntry*>::const_iterator it = maRangeLinks.begin(), itEnd = maRangeLinks.end(); + for (; it != itEnd; ++it) + { + const SvTreeListEntry& rEntry = **it; + const ScOrcusXMLTreeParam::EntryData* pUserData = ScOrcusXMLTreeParam::getUserData(rEntry); + + ScOrcusImportXMLParam::RangeLink aRangeLink; + aRangeLink.maPos = pUserData->maLinkedPos; + + // Go through all its child elements. + getFieldLinks(aRangeLink, maLbTree, rEntry); + + aParam.maRangeLinks.push_back(aRangeLink); + } + } ScOrcusFilters* pOrcus = ScFormatFilter::Get().GetOrcusFilters(); if (!pOrcus) |