Kaydet (Commit) 260e5b61 authored tarafından Caolán McNamara's avatar Caolán McNamara

weld ScXMLSourceDlg

Change-Id: If8894b7c432006f196e040571757943c940f13ea
Reviewed-on: https://gerrit.libreoffice.org/71489
Tested-by: Jenkins
Reviewed-by: 's avatarCaolán McNamara <caolanm@redhat.com>
Tested-by: 's avatarCaolán McNamara <caolanm@redhat.com>
üst 7d53d589
......@@ -13,11 +13,11 @@
#include <rtl/ustring.hxx>
class ScDocument;
class SvTreeListBox;
struct ScOrcusXMLTreeParam;
struct ScOrcusImportXMLParam;
class ScOrcusXMLContext;
class SfxMedium;
namespace weld { class TreeView; }
/**
* Collection of orcus filter wrappers.
......@@ -60,7 +60,7 @@ class ScOrcusXMLContext
public:
virtual ~ScOrcusXMLContext() {}
virtual void loadXMLStructure(SvTreeListBox& rTreeCtrl, ScOrcusXMLTreeParam& rParam) = 0;
virtual void loadXMLStructure(weld::TreeView& rTreeCtrl, ScOrcusXMLTreeParam& rParam) = 0;
virtual void importXML(const ScOrcusImportXMLParam& rParam) = 0;
};
......
......@@ -17,7 +17,10 @@
#include <vector>
#include <memory>
class SvTreeListEntry;
namespace weld {
class TreeIter;
class TreeView;
}
/**
* Parameter used during call to ScOrcusFilters::loadXMLStructure().
......@@ -40,9 +43,9 @@ struct ScOrcusXMLTreeParam
typedef std::vector<std::unique_ptr<EntryData>> UserDataStoreType;
Image maImgElementDefault;
Image maImgElementRepeat;
Image maImgAttribute;
OUString maImgElementDefault;
OUString maImgElementRepeat;
OUString maImgAttribute;
/**
* Store all custom data instances since the tree control doesn't manage
......@@ -50,7 +53,7 @@ struct ScOrcusXMLTreeParam
*/
UserDataStoreType m_UserDataStore;
static SC_DLLPUBLIC EntryData* getUserData(const SvTreeListEntry& rEntry);
static SC_DLLPUBLIC EntryData* getUserData(const weld::TreeView& rControl, const weld::TreeIter& rEntry);
};
struct ScOrcusImportXMLParam
......
......@@ -9,7 +9,7 @@
#include <orcusxml.hxx>
#include <vcl/treelistentry.hxx>
#include <vcl/weld.hxx>
ScOrcusXMLTreeParam::EntryData::EntryData(EntryType eType)
: mnNamespaceID(0)
......@@ -19,9 +19,9 @@ ScOrcusXMLTreeParam::EntryData::EntryData(EntryType eType)
, mbLeafNode(true)
{}
ScOrcusXMLTreeParam::EntryData* ScOrcusXMLTreeParam::getUserData(const SvTreeListEntry& rEntry)
ScOrcusXMLTreeParam::EntryData* ScOrcusXMLTreeParam::getUserData(const weld::TreeView& rControl, const weld::TreeIter& rEntry)
{
return static_cast<ScOrcusXMLTreeParam::EntryData*>(rEntry.GetUserData());
return reinterpret_cast<ScOrcusXMLTreeParam::EntryData*>(rControl.get_id(rEntry).toInt64());
}
ScOrcusImportXMLParam::CellLink::CellLink(const ScAddress& rPos, const OString& rPath) :
......
......@@ -41,7 +41,7 @@ public:
ScOrcusXMLContextImpl(ScDocument& rDoc, const OUString& rPath);
virtual ~ScOrcusXMLContextImpl() override;
virtual void loadXMLStructure(SvTreeListBox& rTreeCtrl, ScOrcusXMLTreeParam& rParam) override;
virtual void loadXMLStructure(weld::TreeView& rTreeCtrl, ScOrcusXMLTreeParam& rParam) override;
virtual void importXML(const ScOrcusImportXMLParam& rParam) override;
};
......
......@@ -15,6 +15,7 @@
#include <vcl/treelistbox.hxx>
#include <vcl/treelistentry.hxx>
#include <vcl/weld.hxx>
#include <ucbhelper/content.hxx>
#include <sal/log.hxx>
......@@ -38,11 +39,11 @@ using namespace com::sun::star;
namespace {
ScOrcusXMLTreeParam::EntryData& setUserDataToEntry(
SvTreeListEntry& rEntry, ScOrcusXMLTreeParam::UserDataStoreType& rStore, ScOrcusXMLTreeParam::EntryType eType)
ScOrcusXMLTreeParam::EntryData& setUserDataToEntry(weld::TreeView& rControl,
weld::TreeIter& rEntry, ScOrcusXMLTreeParam::UserDataStoreType& rStore, ScOrcusXMLTreeParam::EntryType eType)
{
rStore.push_back(std::make_unique<ScOrcusXMLTreeParam::EntryData>(eType));
rEntry.SetUserData(rStore.back().get());
rControl.set_id(rEntry, OUString::number(reinterpret_cast<sal_Int64>(rStore.back().get())));
return *rStore.back();
}
......@@ -68,17 +69,17 @@ OUString toString(const orcus::xml_structure_tree::entity_name& entity, const or
}
void populateTree(
SvTreeListBox& rTreeCtrl, orcus::xml_structure_tree::walker& rWalker,
weld::TreeView& rTreeCtrl, orcus::xml_structure_tree::walker& rWalker,
const orcus::xml_structure_tree::entity_name& rElemName, bool bRepeat,
SvTreeListEntry* pParent, ScOrcusXMLTreeParam& rParam)
weld::TreeIter* pParent, ScOrcusXMLTreeParam& rParam)
{
SvTreeListEntry* pEntry = rTreeCtrl.InsertEntry(toString(rElemName, rWalker), pParent);
if (!pEntry)
// Can this ever happen!?
return;
OUString sEntry(toString(rElemName, rWalker));
std::unique_ptr<weld::TreeIter> xEntry(rTreeCtrl.make_iterator());
rTreeCtrl.insert(pParent, -1, &sEntry, nullptr, nullptr, nullptr, nullptr, false, xEntry.get());
rTreeCtrl.set_image(*xEntry, rParam.maImgElementDefault, -1);
ScOrcusXMLTreeParam::EntryData& rEntryData = setUserDataToEntry(
*pEntry, rParam.m_UserDataStore,
ScOrcusXMLTreeParam::EntryData& rEntryData = setUserDataToEntry(rTreeCtrl,
*xEntry, rParam.m_UserDataStore,
bRepeat ? ScOrcusXMLTreeParam::ElementRepeat : ScOrcusXMLTreeParam::ElementDefault);
setEntityNameToUserData(rEntryData, rElemName, rWalker);
......@@ -86,32 +87,25 @@ void populateTree(
if (bRepeat)
{
// Recurring elements use different icon.
rTreeCtrl.SetExpandedEntryBmp(pEntry, rParam.maImgElementRepeat);
rTreeCtrl.SetCollapsedEntryBmp(pEntry, rParam.maImgElementRepeat);
rTreeCtrl.set_image(*xEntry, rParam.maImgElementRepeat, -1);
}
if (pParent)
rTreeCtrl.Expand(pParent);
orcus::xml_structure_tree::entity_names_type aNames;
// Insert attributes.
rWalker.get_attributes(aNames);
for (const orcus::xml_structure_tree::entity_name& rAttrName : aNames)
{
SvTreeListEntry* pAttr = rTreeCtrl.InsertEntry(toString(rAttrName, rWalker), pEntry);
if (!pAttr)
continue;
OUString sAttr(toString(rAttrName, rWalker));
std::unique_ptr<weld::TreeIter> xAttr(rTreeCtrl.make_iterator());
rTreeCtrl.insert(xEntry.get(), -1, &sAttr, nullptr, nullptr, nullptr, nullptr, false, xAttr.get());
ScOrcusXMLTreeParam::EntryData& rAttrData =
setUserDataToEntry(*pAttr, rParam.m_UserDataStore, ScOrcusXMLTreeParam::Attribute);
setUserDataToEntry(rTreeCtrl, *xAttr, rParam.m_UserDataStore, ScOrcusXMLTreeParam::Attribute);
setEntityNameToUserData(rAttrData, rAttrName, rWalker);
rTreeCtrl.SetExpandedEntryBmp(pAttr, rParam.maImgAttribute);
rTreeCtrl.SetCollapsedEntryBmp(pAttr, rParam.maImgAttribute);
rTreeCtrl.set_image(*xAttr, rParam.maImgAttribute, -1);
}
rTreeCtrl.Expand(pEntry);
rWalker.get_children(aNames);
......@@ -122,23 +116,23 @@ void populateTree(
for (const auto& rName : aNames)
{
orcus::xml_structure_tree::element aElem = rWalker.descend(rName);
populateTree(rTreeCtrl, rWalker, rName, aElem.repeat, pEntry, rParam);
populateTree(rTreeCtrl, rWalker, rName, aElem.repeat, xEntry.get(), rParam);
rWalker.ascend();
}
}
class TreeUpdateSwitch
{
SvTreeListBox& mrTreeCtrl;
weld::TreeView& mrTreeCtrl;
public:
explicit TreeUpdateSwitch(SvTreeListBox& rTreeCtrl) : mrTreeCtrl(rTreeCtrl)
explicit TreeUpdateSwitch(weld::TreeView& rTreeCtrl) : mrTreeCtrl(rTreeCtrl)
{
mrTreeCtrl.SetUpdateMode(false);
mrTreeCtrl.freeze();
}
~TreeUpdateSwitch()
{
mrTreeCtrl.SetUpdateMode(true);
mrTreeCtrl.thaw();
}
};
......@@ -180,7 +174,7 @@ ScOrcusXMLContextImpl::ScOrcusXMLContextImpl(ScDocument& rDoc, const OUString& r
ScOrcusXMLContextImpl::~ScOrcusXMLContextImpl() {}
void ScOrcusXMLContextImpl::loadXMLStructure(SvTreeListBox& rTreeCtrl, ScOrcusXMLTreeParam& rParam)
void ScOrcusXMLContextImpl::loadXMLStructure(weld::TreeView& rTreeCtrl, ScOrcusXMLTreeParam& rParam)
{
rParam.m_UserDataStore.clear();
......@@ -197,9 +191,7 @@ void ScOrcusXMLContextImpl::loadXMLStructure(SvTreeListBox& rTreeCtrl, ScOrcusXM
aXmlTree.parse(&aStrm[0], aStrm.size());
TreeUpdateSwitch aSwitch(rTreeCtrl);
rTreeCtrl.Clear();
rTreeCtrl.SetDefaultCollapsedEntryBmp(rParam.maImgElementDefault);
rTreeCtrl.SetDefaultExpandedEntryBmp(rParam.maImgElementDefault);
rTreeCtrl.clear();
orcus::xml_structure_tree::walker aWalker = aXmlTree.get_walker();
......@@ -215,6 +207,11 @@ void ScOrcusXMLContextImpl::loadXMLStructure(SvTreeListBox& rTreeCtrl, ScOrcusXM
{
SAL_WARN("sc.orcus", "parsing failed with an unknown error " << e.what());
}
rTreeCtrl.all_foreach([&rTreeCtrl](weld::TreeIter& rEntry){
rTreeCtrl.expand_row(rEntry);
return false;
});
}
namespace {
......
......@@ -26,78 +26,89 @@ class ScDocument;
class ScRange;
class ScOrcusXMLContext;
class ScXMLSourceDlg : public ScAnyRefDlg
struct CustomCompare
{
VclPtr<PushButton> mpBtnSelectSource;
VclPtr<FixedText> mpFtSourceFile;
VclPtr<VclContainer> mpMapGrid;
VclPtr<SvTreeListBox> mpLbTree;
VclPtr<formula::RefEdit> mpRefEdit;
VclPtr<formula::RefButton> mpRefBtn;
weld::TreeView& mrLbTree;
CustomCompare(weld::TreeView& rLbTree)
: mrLbTree(rLbTree)
{
}
bool operator()(const std::unique_ptr<weld::TreeIter>& lhs, const std::unique_ptr<weld::TreeIter>& rhs) const
{
return mrLbTree.iter_compare(*lhs, *rhs) == -1;
}
};
VclPtr<PushButton> mpBtnOk;
VclPtr<CancelButton> mpBtnCancel;
class ScXMLSourceDlg : public ScAnyRefDlgController
{
OUString maSrcPath;
ScOrcusXMLTreeParam maXMLParam;
std::set<const SvTreeListEntry*> maCellLinks;
std::set<const SvTreeListEntry*> maRangeLinks;
std::vector<SvTreeListEntry*> maHighlightedEntries;
SvTreeListEntry* mpCurRefEntry;
std::unique_ptr<weld::TreeIter> mxCurRefEntry;
std::unique_ptr<ScOrcusXMLContext> mpXMLContext;
ScDocument* mpDoc;
VclPtr<formula::RefEdit> mpActiveEdit;
bool mbDlgLostFocus;
formula::WeldRefEdit* mpActiveEdit;
std::unique_ptr<weld::Button> mxBtnSelectSource;
std::unique_ptr<weld::Label> mxFtSourceFile;
std::unique_ptr<weld::Container> mxMapGrid;
std::unique_ptr<weld::TreeView> mxLbTree;
std::unique_ptr<formula::WeldRefEdit> mxRefEdit;
std::unique_ptr<formula::WeldRefButton> mxRefBtn;
std::unique_ptr<weld::Button> mxBtnOk;
std::unique_ptr<weld::Button> mxBtnCancel;
CustomCompare maCustomCompare;
std::set<std::unique_ptr<weld::TreeIter>, CustomCompare> maCellLinks;
std::set<std::unique_ptr<weld::TreeIter>, CustomCompare> maRangeLinks;
public:
ScXMLSourceDlg(
SfxBindings* pB, SfxChildWindow* pCW, vcl::Window* pParent, ScDocument* pDoc);
ScXMLSourceDlg(SfxBindings* pB, SfxChildWindow* pCW, weld::Window* pParent, ScDocument* pDoc);
virtual ~ScXMLSourceDlg() override;
virtual void dispose() override;
virtual bool IsRefInputMode() const override;
virtual void SetReference(const ScRange& rRange, ScDocument* pDoc) override;
virtual void Deactivate() override;
virtual void SetActive() override;
virtual bool Close() override;
virtual void Close() override;
private:
void SelectSourceFile();
void LoadSourceFileStructure(const OUString& rPath);
void HandleGetFocus(const Control* pCtrl);
void TreeItemSelected();
void DefaultElementSelected(SvTreeListEntry& rEntry);
void RepeatElementSelected(SvTreeListEntry& rEntry);
void AttributeSelected(SvTreeListEntry& rEntry);
void DefaultElementSelected(weld::TreeIter& rEntry);
void RepeatElementSelected(weld::TreeIter& rEntry);
void AttributeSelected(weld::TreeIter& rEntry);
void SetNonLinkable();
void SetSingleLinkable();
void SetRangeLinkable();
void SelectAllChildEntries(SvTreeListEntry& rEntry);
void SelectAllChildEntries(weld::TreeIter& rEntry);
/**
* Check if any of its parents is linked or repeated. The passed entry is
* not checked; its parent is the first one to be checked, then all its
* parents get checked all the way to the root.
*/
bool IsParentDirty(SvTreeListEntry* pEntry) const;
bool IsParentDirty(weld::TreeIter* pEntry) const;
bool IsChildrenDirty(SvTreeListEntry* pEntry) const;
bool IsChildrenDirty(weld::TreeIter* pEntry) const;
void OkPressed();
void CancelPressed();
void RefEditModified();
DECL_LINK(GetFocusHdl, Control&, void);
DECL_LINK(BtnPressedHdl, Button*, void);
DECL_LINK(TreeItemSelectHdl, SvTreeListBox*, void);
DECL_LINK(RefModifiedHdl, Edit&, void);
DECL_LINK(BtnPressedHdl, weld::Button&, void);
DECL_LINK(TreeItemSelectHdl, weld::TreeView&, void);
DECL_LINK(RefModifiedHdl, formula::WeldRefEdit&, void);
};
#endif
......
......@@ -36,7 +36,7 @@ SFX_IMPL_MODELESSDIALOGCONTOLLER_WITHID(ScNameDlgWrapper, FID_DEFINE_NAME)
SFX_IMPL_MODELESSDIALOGCONTOLLER_WITHID(ScNameDefDlgWrapper, FID_ADD_NAME )
SFX_IMPL_MODELESSDIALOGCONTOLLER_WITHID(ScSolverDlgWrapper, SID_OPENDLG_SOLVE )
SFX_IMPL_MODELESSDIALOGCONTOLLER_WITHID(ScOptSolverDlgWrapper, SID_OPENDLG_OPTSOLVER )
SFX_IMPL_MODELESSDIALOG_WITHID(ScXMLSourceDlgWrapper, SID_MANAGE_XML_SOURCE)
SFX_IMPL_MODELESSDIALOGCONTOLLER_WITHID(ScXMLSourceDlgWrapper, SID_MANAGE_XML_SOURCE)
SFX_IMPL_MODELESSDIALOG_WITHID(ScPivotLayoutWrapper, SID_OPENDLG_PIVOTTABLE )
SFX_IMPL_MODELESSDIALOGCONTOLLER_WITHID(ScTabOpDlgWrapper, SID_OPENDLG_TABOP )
SFX_IMPL_MODELESSDIALOGCONTOLLER_WITHID(ScFilterDlgWrapper, SID_FILTER )
......@@ -129,7 +129,7 @@ IMPL_CONTROLLER_CHILD_CTOR( ScSolverDlgWrapper, SID_OPENDLG_SOLVE )
IMPL_CONTROLLER_CHILD_CTOR( ScOptSolverDlgWrapper, SID_OPENDLG_OPTSOLVER )
IMPL_CHILD_CTOR( ScXMLSourceDlgWrapper, SID_MANAGE_XML_SOURCE)
IMPL_CONTROLLER_CHILD_CTOR( ScXMLSourceDlgWrapper, SID_MANAGE_XML_SOURCE)
IMPL_CHILD_CTOR( ScPivotLayoutWrapper, SID_OPENDLG_PIVOTTABLE )
......
......@@ -167,12 +167,6 @@ VclPtr<SfxModelessDialog> ScTabViewShell::CreateRefDialog(
}
break;
case SID_MANAGE_XML_SOURCE:
{
pResult = VclPtr<ScXMLSourceDlg>::Create(pB, pCW, pParent, pDoc);
}
break;
case WID_CONDFRMT_REF:
{
bool bFound = false;
......@@ -478,6 +472,11 @@ std::unique_ptr<SfxModelessDialogController> ScTabViewShell::CreateRefDialogCont
xResult.reset(new ScHighlightChgDlg(pB, pCW, pParent, &GetViewData()));
break;
}
case SID_MANAGE_XML_SOURCE:
{
xResult.reset(new ScXMLSourceDlg(pB, pCW, pParent, pDoc));
break;
}
}
if (xResult)
......
......@@ -57,6 +57,7 @@ sc/uiconfig/scalc/ui/ttestdialog.ui://GtkButton[@id='variable2-range-button'] bu
sc/uiconfig/scalc/ui/ttestdialog.ui://GtkButton[@id='output-range-button'] button-no-label
sc/uiconfig/scalc/ui/validationcriteriapage.ui://GtkButton[@id='validref'] no-labelled-by
sc/uiconfig/scalc/ui/validationcriteriapage.ui://GtkButton[@id='validref'] button-no-label
sc/uiconfig/scalc/ui/xmlsourcedialog.ui://GtkButton[@id='ref'] button-no-label
sc/uiconfig/scalc/ui/ztestdialog.ui://GtkButton[@id='variable1-range-button'] button-no-label
sc/uiconfig/scalc/ui/ztestdialog.ui://GtkButton[@id='variable2-range-button'] button-no-label
sc/uiconfig/scalc/ui/ztestdialog.ui://GtkButton[@id='output-range-button'] button-no-label
......@@ -232,6 +232,6 @@ sc/uiconfig/scalc/ui/validationcriteriapage.ui://GtkButton[@id='validref'] no-la
sc/uiconfig/scalc/ui/validationcriteriapage.ui://GtkTextView[@id='minlist'] no-labelled-by
sc/uiconfig/scalc/ui/validationcriteriapage.ui://GtkLabel[@id='hintft'] orphan-label
sc/uiconfig/scalc/ui/xmlsourcedialog.ui://GtkLabel[@id='sourcefile'] orphan-label
sc/uiconfig/scalc/ui/xmlsourcedialog.ui://vcllo-SvTreeListBox[@id='tree:border'] no-labelled-by
sc/uiconfig/scalc/ui/xmlsourcedialog.ui://GtkTreeView[@id='tree'] no-labelled-by
sc/uiconfig/scalc/ui/xmlsourcedialog.ui://GtkLabel[@id='label5'] orphan-label
sc/uiconfig/scalc/ui/xmlsourcedialog.ui://foruilo-RefEdit[@id='edit'] no-labelled-by
sc/uiconfig/scalc/ui/xmlsourcedialog.ui://GtkEntry[@id='edit'] no-labelled-by
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment