sc/Library_scfilt.mk | 1 sc/inc/orcusfilters.hxx | 4 +- sc/inc/orcusxml.hxx | 47 +++++++++++++++++++++++++ sc/source/filter/inc/orcusfiltersimpl.hxx | 3 - sc/source/filter/orcus/orcusfiltersimpl.cxx | 51 ++++++++++++++++++++-------- sc/source/filter/orcus/orcusxml.cxx | 15 ++++++++ sc/source/ui/inc/xmlsourcedlg.hxx | 6 +-- sc/source/ui/xmlsource/xmlsourcedlg.cxx | 10 ++--- 8 files changed, 112 insertions(+), 25 deletions(-)
New commits: commit b259bba4637795c52b3d4b3a0201236567057bcc Author: Kohei Yoshida <kohei.yosh...@gmail.com> Date: Fri Oct 12 17:20:52 2012 -0400 Set user data to each tree entry. Change-Id: I708bbbae7696a66f7acae8a8d01c98a3c81d32e8 diff --git a/sc/Library_scfilt.mk b/sc/Library_scfilt.mk index 7a5256e..8809028 100644 --- a/sc/Library_scfilt.mk +++ b/sc/Library_scfilt.mk @@ -219,6 +219,7 @@ $(eval $(call gb_Library_add_exception_objects,scfilt,\ sc/source/filter/oox/worksheethelper \ sc/source/filter/oox/worksheetsettings \ sc/source/filter/orcus/orcusfiltersimpl \ + sc/source/filter/orcus/orcusxml \ )) # vim: set noet sw=4 ts=4: diff --git a/sc/inc/orcusfilters.hxx b/sc/inc/orcusfilters.hxx index 506e822..019441c 100644 --- a/sc/inc/orcusfilters.hxx +++ b/sc/inc/orcusfilters.hxx @@ -28,7 +28,7 @@ public: virtual bool importCSV(ScDocument& rDoc, const rtl::OUString& rPath) const = 0; virtual bool loadXMLStructure( - SvTreeListBox& rTreeCtrl, const rtl::OUString& rPath, ScOrcusXMLTreeParam& rParam) const = 0; + const rtl::OUString& rPath, SvTreeListBox& rTreeCtrl, ScOrcusXMLTreeParam& rParam) const = 0; }; #endif diff --git a/sc/inc/orcusxml.hxx b/sc/inc/orcusxml.hxx index dfb2867..cdc4679 100644 --- a/sc/inc/orcusxml.hxx +++ b/sc/inc/orcusxml.hxx @@ -25,6 +25,8 @@ struct ScOrcusXMLTreeParam struct TreeEntryUserData { EntryType meType; + + TreeEntryUserData(EntryType eType); }; typedef boost::ptr_vector<TreeEntryUserData> UserDataStoreType; diff --git a/sc/source/filter/inc/orcusfiltersimpl.hxx b/sc/source/filter/inc/orcusfiltersimpl.hxx index 29562c2..956e940 100644 --- a/sc/source/filter/inc/orcusfiltersimpl.hxx +++ b/sc/source/filter/inc/orcusfiltersimpl.hxx @@ -18,7 +18,7 @@ public: virtual bool importCSV(ScDocument& rDoc, const rtl::OUString& rPath) const; virtual bool loadXMLStructure( - SvTreeListBox& rTreeCtrl, const rtl::OUString& rPath, ScOrcusXMLTreeParam& rParam) const; + const rtl::OUString& rPath, SvTreeListBox& rTreeCtrl, ScOrcusXMLTreeParam& rParam) const; }; #endif diff --git a/sc/source/filter/orcus/orcusfiltersimpl.cxx b/sc/source/filter/orcus/orcusfiltersimpl.cxx index 3e9bca0..c5b8711 100644 --- a/sc/source/filter/orcus/orcusfiltersimpl.cxx +++ b/sc/source/filter/orcus/orcusfiltersimpl.cxx @@ -176,6 +176,13 @@ bool ScOrcusFiltersImpl::importCSV(ScDocument& rDoc, const OUString& rPath) cons namespace { +void setUserDataToEntry( + SvLBoxEntry& rEntry, ScOrcusXMLTreeParam::UserDataStoreType& rStore, ScOrcusXMLTreeParam::EntryType eType) +{ + rStore.push_back(new ScOrcusXMLTreeParam::TreeEntryUserData(eType)); + rEntry.SetUserData(&rStore.back()); +} + void populateTree( SvTreeListBox& rTreeCtrl, orcus::xml_structure_tree::walker& rWalker, const orcus::xml_structure_tree::entity_name& rElemName, bool bRepeat, @@ -183,8 +190,17 @@ void populateTree( { OUString aName(rElemName.name.get(), rElemName.name.size(), RTL_TEXTENCODING_UTF8); SvLBoxEntry* pEntry = rTreeCtrl.InsertEntry(aName, pParent); + if (!pEntry) + // Can this ever happen!? + return; + + setUserDataToEntry( + *pEntry, rParam.maUserDataStore, + bRepeat ? ScOrcusXMLTreeParam::ElementRepeat : ScOrcusXMLTreeParam::ElementDefault); + if (bRepeat) { + // Recurring elements use different icon. rTreeCtrl.SetExpandedEntryBmp(pEntry, rParam.maImgElementRepeat); rTreeCtrl.SetCollapsedEntryBmp(pEntry, rParam.maImgElementRepeat); } @@ -194,13 +210,20 @@ void populateTree( orcus::xml_structure_tree::entity_names_type aNames; + // Insert attributes. rWalker.get_attributes(aNames); orcus::xml_structure_tree::entity_names_type::const_iterator it = aNames.begin(); orcus::xml_structure_tree::entity_names_type::const_iterator itEnd = aNames.end(); for (; it != itEnd; ++it) { orcus::xml_structure_tree::entity_name aAttrName = *it; - SvLBoxEntry* pAttr = rTreeCtrl.InsertEntry(OUString(aAttrName.name.get(), aAttrName.name.size(), RTL_TEXTENCODING_UTF8), pEntry); + SvLBoxEntry* pAttr = rTreeCtrl.InsertEntry( + OUString(aAttrName.name.get(), aAttrName.name.size(), RTL_TEXTENCODING_UTF8), pEntry); + + if (!pAttr) + continue; + + setUserDataToEntry(*pAttr, rParam.maUserDataStore, ScOrcusXMLTreeParam::Attribute); rTreeCtrl.SetExpandedEntryBmp(pAttr, rParam.maImgAttribute); rTreeCtrl.SetCollapsedEntryBmp(pAttr, rParam.maImgAttribute); } @@ -208,6 +231,7 @@ void populateTree( rWalker.get_children(aNames); + // Insert child elements recursively. for (it = aNames.begin(), itEnd = aNames.end(); it != itEnd; ++it) { orcus::xml_structure_tree::element aElem = rWalker.descend(*it); @@ -234,8 +258,10 @@ public: } bool ScOrcusFiltersImpl::loadXMLStructure( - SvTreeListBox& rTreeCtrl, const rtl::OUString& rPath, ScOrcusXMLTreeParam& rParam) const + const rtl::OUString& rPath, SvTreeListBox& rTreeCtrl, ScOrcusXMLTreeParam& rParam) const { + rParam.maUserDataStore.clear(); + INetURLObject aURL(rPath); OString aSysPath = rtl::OUStringToOString(aURL.getFSysPath(SYSTEM_PATH), RTL_TEXTENCODING_UTF8); const char* path = aSysPath.getStr(); diff --git a/sc/source/filter/orcus/orcusxml.cxx b/sc/source/filter/orcus/orcusxml.cxx new file mode 100644 index 0000000..68746be --- /dev/null +++ b/sc/source/filter/orcus/orcusxml.cxx @@ -0,0 +1,15 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include "orcusxml.hxx" + +ScOrcusXMLTreeParam::TreeEntryUserData::TreeEntryUserData(EntryType eType) : + meType(eType) {} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sc/source/ui/xmlsource/xmlsourcedlg.cxx b/sc/source/ui/xmlsource/xmlsourcedlg.cxx index 6c3369a..1b9f213 100644 --- a/sc/source/ui/xmlsource/xmlsourcedlg.cxx +++ b/sc/source/ui/xmlsource/xmlsourcedlg.cxx @@ -165,7 +165,7 @@ void ScXMLSourceDlg::LoadSourceFileStructure(const OUString& rPath) if (!pOrcus) return; - pOrcus->loadXMLStructure(maLbTree, rPath, maXMLParam); + pOrcus->loadXMLStructure(rPath, maLbTree, maXMLParam); } void ScXMLSourceDlg::HandleGetFocus(Control* pCtrl) commit 4e736ba81d1a32a39eec7b78f6f8db9fbc8c7a30 Author: Kohei Yoshida <kohei.yosh...@gmail.com> Date: Fri Oct 12 16:35:27 2012 -0400 Use param structure to consolidate parameters for loadXMLStructure() call. Change-Id: I3e5895cd6b2bae4fd18aa13ebf88321f32a95f8d diff --git a/sc/inc/orcusfilters.hxx b/sc/inc/orcusfilters.hxx index 7db7034..506e822 100644 --- a/sc/inc/orcusfilters.hxx +++ b/sc/inc/orcusfilters.hxx @@ -15,6 +15,7 @@ class ScDocument; class SvTreeListBox; class Image; +struct ScOrcusXMLTreeParam; /** * Collection of orcus filter wrappers. @@ -27,8 +28,7 @@ public: virtual bool importCSV(ScDocument& rDoc, const rtl::OUString& rPath) const = 0; virtual bool loadXMLStructure( - SvTreeListBox& rTreeCtrl, const rtl::OUString& rPath, - const Image& rImgDefaultElem, const Image& rImgRepeatElem, const Image& rImgElemAttr) const = 0; + SvTreeListBox& rTreeCtrl, const rtl::OUString& rPath, ScOrcusXMLTreeParam& rParam) const = 0; }; #endif diff --git a/sc/inc/orcusxml.hxx b/sc/inc/orcusxml.hxx new file mode 100644 index 0000000..dfb2867 --- /dev/null +++ b/sc/inc/orcusxml.hxx @@ -0,0 +1,45 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#ifndef __SC_ORCUSXML_HXX__ +#define __SC_ORCUSXML_HXX__ + +#include "vcl/image.hxx" + +#include <boost/ptr_container/ptr_vector.hpp> + +/** + * Parameter used during call to ScOrcusFilters::loadXMLStructure(). + */ +struct ScOrcusXMLTreeParam +{ + enum EntryType { ElementDefault, ElementRepeat, Attribute }; + + /** Custom data stored with each tree item. */ + struct TreeEntryUserData + { + EntryType meType; + }; + + typedef boost::ptr_vector<TreeEntryUserData> UserDataStoreType; + + Image maImgElementDefault; + Image maImgElementRepeat; + Image maImgAttribute; + + /** + * Store all custom data instances since the tree control doesn't manage + * the life cycle of user datas. + */ + UserDataStoreType maUserDataStore; +}; + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sc/source/filter/inc/orcusfiltersimpl.hxx b/sc/source/filter/inc/orcusfiltersimpl.hxx index 2f42d0b..29562c2 100644 --- a/sc/source/filter/inc/orcusfiltersimpl.hxx +++ b/sc/source/filter/inc/orcusfiltersimpl.hxx @@ -18,8 +18,7 @@ public: virtual bool importCSV(ScDocument& rDoc, const rtl::OUString& rPath) const; virtual bool loadXMLStructure( - SvTreeListBox& rTreeCtrl, const rtl::OUString& rPath, - const Image& rImgDefaultElem, const Image& rImgRepeatElem, const Image& rImgElemAttr) const; + SvTreeListBox& rTreeCtrl, const rtl::OUString& rPath, ScOrcusXMLTreeParam& rParam) const; }; #endif diff --git a/sc/source/filter/orcus/orcusfiltersimpl.cxx b/sc/source/filter/orcus/orcusfiltersimpl.cxx index 8d8705c..3e9bca0 100644 --- a/sc/source/filter/orcus/orcusfiltersimpl.cxx +++ b/sc/source/filter/orcus/orcusfiltersimpl.cxx @@ -10,6 +10,7 @@ #include "orcusfiltersimpl.hxx" #include "document.hxx" +#include "orcusxml.hxx" #include "tools/urlobj.hxx" #include "svtools/treelistbox.hxx" @@ -178,15 +179,14 @@ namespace { void populateTree( SvTreeListBox& rTreeCtrl, orcus::xml_structure_tree::walker& rWalker, const orcus::xml_structure_tree::entity_name& rElemName, bool bRepeat, - const Image& rImgRepeatElem, const Image& rImgElemAttr, - SvLBoxEntry* pParent) + SvLBoxEntry* pParent, ScOrcusXMLTreeParam& rParam) { OUString aName(rElemName.name.get(), rElemName.name.size(), RTL_TEXTENCODING_UTF8); SvLBoxEntry* pEntry = rTreeCtrl.InsertEntry(aName, pParent); if (bRepeat) { - rTreeCtrl.SetExpandedEntryBmp(pEntry, rImgRepeatElem); - rTreeCtrl.SetCollapsedEntryBmp(pEntry, rImgRepeatElem); + rTreeCtrl.SetExpandedEntryBmp(pEntry, rParam.maImgElementRepeat); + rTreeCtrl.SetCollapsedEntryBmp(pEntry, rParam.maImgElementRepeat); } if (pParent) @@ -201,8 +201,8 @@ void populateTree( { orcus::xml_structure_tree::entity_name aAttrName = *it; SvLBoxEntry* pAttr = rTreeCtrl.InsertEntry(OUString(aAttrName.name.get(), aAttrName.name.size(), RTL_TEXTENCODING_UTF8), pEntry); - rTreeCtrl.SetExpandedEntryBmp(pAttr, rImgElemAttr); - rTreeCtrl.SetCollapsedEntryBmp(pAttr, rImgElemAttr); + rTreeCtrl.SetExpandedEntryBmp(pAttr, rParam.maImgAttribute); + rTreeCtrl.SetCollapsedEntryBmp(pAttr, rParam.maImgAttribute); } rTreeCtrl.Expand(pEntry); @@ -211,7 +211,7 @@ void populateTree( for (it = aNames.begin(), itEnd = aNames.end(); it != itEnd; ++it) { orcus::xml_structure_tree::element aElem = rWalker.descend(*it); - populateTree(rTreeCtrl, rWalker, *it, aElem.repeat, rImgRepeatElem, rImgElemAttr, pEntry); + populateTree(rTreeCtrl, rWalker, *it, aElem.repeat, pEntry, rParam); rWalker.ascend(); } } @@ -234,8 +234,7 @@ public: } bool ScOrcusFiltersImpl::loadXMLStructure( - SvTreeListBox& rTreeCtrl, const rtl::OUString& rPath, - const Image& rImgDefaultElem, const Image& rImgRepeatElem, const Image& rImgElemAttr) const + SvTreeListBox& rTreeCtrl, const rtl::OUString& rPath, ScOrcusXMLTreeParam& rParam) const { INetURLObject aURL(rPath); OString aSysPath = rtl::OUStringToOString(aURL.getFSysPath(SYSTEM_PATH), RTL_TEXTENCODING_UTF8); @@ -256,14 +255,14 @@ bool ScOrcusFiltersImpl::loadXMLStructure( TreeUpdateSwitch aSwitch(rTreeCtrl); rTreeCtrl.Clear(); - rTreeCtrl.SetDefaultCollapsedEntryBmp(rImgDefaultElem); - rTreeCtrl.SetDefaultExpandedEntryBmp(rImgDefaultElem); + rTreeCtrl.SetDefaultCollapsedEntryBmp(rParam.maImgElementDefault); + rTreeCtrl.SetDefaultExpandedEntryBmp(rParam.maImgElementDefault); orcus::xml_structure_tree::walker aWalker = aXmlTree.get_walker(); // Root element. orcus::xml_structure_tree::element aElem = aWalker.root(); - populateTree(rTreeCtrl, aWalker, aElem.name, aElem.repeat, rImgRepeatElem, rImgElemAttr, NULL); + populateTree(rTreeCtrl, aWalker, aElem.name, aElem.repeat, NULL, rParam); } catch (const std::exception&) { diff --git a/sc/source/ui/inc/xmlsourcedlg.hxx b/sc/source/ui/inc/xmlsourcedlg.hxx index 28e39c3..75d698f 100644 --- a/sc/source/ui/inc/xmlsourcedlg.hxx +++ b/sc/source/ui/inc/xmlsourcedlg.hxx @@ -16,6 +16,7 @@ #include "expftext.hxx" #include "anyrefdg.hxx" +#include "orcusxml.hxx" #include <boost/scoped_ptr.hpp> @@ -45,15 +46,14 @@ class ScXMLSourceDlg : public ScAnyRefDlg CancelButton maBtnCancel; Image maImgFileOpen; - Image maImgElemDefault; - Image maImgElemRepeat; - Image maImgElemAttribute; rtl::OUString maStrCellLink; rtl::OUString maStrRangeLink; rtl::OUString maSrcPath; + ScOrcusXMLTreeParam maXMLParam; + ScDocument* mpDoc; formula::RefEdit* mpActiveEdit; diff --git a/sc/source/ui/xmlsource/xmlsourcedlg.cxx b/sc/source/ui/xmlsource/xmlsourcedlg.cxx index 5f244f2..6c3369a 100644 --- a/sc/source/ui/xmlsource/xmlsourcedlg.cxx +++ b/sc/source/ui/xmlsource/xmlsourcedlg.cxx @@ -42,15 +42,16 @@ ScXMLSourceDlg::ScXMLSourceDlg( maLbTree(this, ScResId(LB_SOURCE_TREE)), maBtnCancel(this, ScResId(BTN_CANCEL)), maImgFileOpen(ScResId(IMG_FILE_OPEN)), - maImgElemDefault(ScResId(IMG_ELEMENT_DEFAULT)), - maImgElemRepeat(ScResId(IMG_ELEMENT_REPEAT)), - maImgElemAttribute(ScResId(IMG_ELEMENT_ATTRIBUTE)), maStrCellLink(ScResId(STR_CELL_LINK).toString()), maStrRangeLink(ScResId(STR_RANGE_LINK).toString()), mpDoc(pDoc), mpActiveEdit(&maEdit), mbDlgLostFocus(false) { + maXMLParam.maImgElementDefault = Image(ScResId(IMG_ELEMENT_DEFAULT)); + maXMLParam.maImgElementRepeat = Image(ScResId(IMG_ELEMENT_REPEAT)); + maXMLParam.maImgAttribute = Image(ScResId(IMG_ELEMENT_ATTRIBUTE)); + maBtnSelectSource.SetModeImage(maImgFileOpen); FreeResource(); @@ -164,8 +165,7 @@ void ScXMLSourceDlg::LoadSourceFileStructure(const OUString& rPath) if (!pOrcus) return; - pOrcus->loadXMLStructure( - maLbTree, rPath, maImgElemDefault, maImgElemRepeat, maImgElemAttribute); + pOrcus->loadXMLStructure(maLbTree, rPath, maXMLParam); } void ScXMLSourceDlg::HandleGetFocus(Control* pCtrl) _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits