summaryrefslogtreecommitdiff
path: root/sc/source/ui/xmlsource
diff options
context:
space:
mode:
authorKohei Yoshida <kohei.yoshida@gmail.com>2012-11-09 22:10:54 -0500
committerKohei Yoshida <kohei.yoshida@gmail.com>2012-11-28 13:28:29 -0500
commitf10c5f33c17093bac8dd09b1a3b6ea39bdb6020c (patch)
tree367a5d7b5b3f9344878707c3b4a86ba10d4015a2 /sc/source/ui/xmlsource
parenteb85e45358d641a9beb246a97c3144b3d4a591ee (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.cxx75
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)