Resolves: tdf#154322 if entries are disabled while menu is active, update it
Change-Id: Id5cad5f2f4ac21db8675de16f1bc0ceeff39fe6c
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/149424
Tested-by: Caolán McNamara <caolanm@redhat.com>
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
diff --git a/svx/source/form/datanavi.cxx b/svx/source/form/datanavi.cxx
index 992195e..5d3242e 100644
--- a/svx/source/form/datanavi.cxx
+++ b/svx/source/form/datanavi.cxx
@@ -147,32 +147,36 @@ namespace svxform
}
std::unique_ptr<weld::Builder> xBuilder(Application::CreateBuilder(m_xItemList.get(), "svx/ui/formdatamenu.ui"));
std::unique_ptr<weld::Menu> xMenu(xBuilder->weld_menu("menu"));
m_xMenu = xBuilder->weld_menu("menu");
m_aRemovedMenuEntries.clear();
if (DGTInstance == m_eGroup)
xMenu->remove("additem");
m_aRemovedMenuEntries.insert("additem");
else
{
xMenu->remove("addelement");
xMenu->remove("addattribute");
m_aRemovedMenuEntries.insert("addelement");
m_aRemovedMenuEntries.insert("addattribute");
if (DGTSubmission == m_eGroup)
{
xMenu->set_label("additem", SvxResId(RID_STR_DATANAV_ADD_SUBMISSION));
xMenu->set_label("edit", SvxResId(RID_STR_DATANAV_EDIT_SUBMISSION));
xMenu->set_label("delete", SvxResId(RID_STR_DATANAV_REMOVE_SUBMISSION));
m_xMenu->set_label("additem", SvxResId(RID_STR_DATANAV_ADD_SUBMISSION));
m_xMenu->set_label("edit", SvxResId(RID_STR_DATANAV_EDIT_SUBMISSION));
m_xMenu->set_label("delete", SvxResId(RID_STR_DATANAV_REMOVE_SUBMISSION));
}
else
{
xMenu->set_label("additem", SvxResId(RID_STR_DATANAV_ADD_BINDING));
xMenu->set_label("edit", SvxResId(RID_STR_DATANAV_EDIT_BINDING));
xMenu->set_label("delete", SvxResId(RID_STR_DATANAV_REMOVE_BINDING));
m_xMenu->set_label("additem", SvxResId(RID_STR_DATANAV_ADD_BINDING));
m_xMenu->set_label("edit", SvxResId(RID_STR_DATANAV_EDIT_BINDING));
m_xMenu->set_label("delete", SvxResId(RID_STR_DATANAV_REMOVE_BINDING));
}
}
EnableMenuItems(xMenu.get());
OString sCommand = xMenu->popup_at_rect(m_xItemList.get(), tools::Rectangle(aPos, Size(1,1)));
for (const auto& rRemove : m_aRemovedMenuEntries)
m_xMenu->remove(rRemove);
EnableMenuItems();
OString sCommand = m_xMenu->popup_at_rect(m_xItemList.get(), tools::Rectangle(aPos, Size(1,1)));
if (!sCommand.isEmpty())
DoMenuAction(sCommand);
m_xMenu.reset();
return true;
}
@@ -242,7 +246,7 @@ namespace svxform
IMPL_LINK_NOARG(XFormsPage, ItemSelectHdl, weld::TreeView&, void)
{
EnableMenuItems(nullptr);
EnableMenuItems();
PrepDnD();
}
@@ -674,7 +678,7 @@ namespace svxform
}
m_pNaviWin->DisableNotify( false );
EnableMenuItems( nullptr );
EnableMenuItems();
if ( bIsDocModified )
svxform::DataNavigatorWindow::SetDocModified();
return bHandled;
@@ -1103,7 +1107,7 @@ namespace svxform
break;
}
EnableMenuItems( nullptr );
EnableMenuItems();
return sRet;
}
@@ -1161,7 +1165,14 @@ namespace svxform
return DoToolBoxAction(rMenuID);
}
void XFormsPage::EnableMenuItems(weld::Menu* pMenu)
void XFormsPage::SetMenuEntrySensitive(const OString& rIdent, bool bSensitive)
{
if (m_aRemovedMenuEntries.find(rIdent) != m_aRemovedMenuEntries.end())
return;
m_xMenu->set_sensitive(rIdent, bSensitive);
}
void XFormsPage::EnableMenuItems()
{
bool bEnableAdd = false;
bool bEnableEdit = false;
@@ -1212,13 +1223,13 @@ namespace svxform
m_xToolBox->set_item_sensitive("edit", bEnableEdit);
m_xToolBox->set_item_sensitive("delete", bEnableRemove);
if (pMenu)
if (m_xMenu)
{
pMenu->set_sensitive("additem", bEnableAdd);
pMenu->set_sensitive("addelement", bEnableAdd);
pMenu->set_sensitive("addattribute", bEnableAdd);
pMenu->set_sensitive("edit", bEnableEdit);
pMenu->set_sensitive("delete", bEnableRemove);
SetMenuEntrySensitive("additem", bEnableAdd);
SetMenuEntrySensitive("addelement", bEnableAdd);
SetMenuEntrySensitive("addattribute", bEnableAdd);
SetMenuEntrySensitive("edit", bEnableEdit);
SetMenuEntrySensitive("delete", bEnableRemove);
}
if ( DGTInstance != m_eGroup )
return;
@@ -1247,10 +1258,10 @@ namespace svxform
}
m_xToolBox->set_item_label("edit", SvxResId(pResId1));
m_xToolBox->set_item_label("delete", SvxResId(pResId2));
if (pMenu)
if (m_xMenu)
{
pMenu->set_label("edit", SvxResId( pResId1 ) );
pMenu->set_label("delete", SvxResId( pResId2 ) );
m_xMenu->set_label("edit", SvxResId( pResId1 ) );
m_xMenu->set_label("delete", SvxResId( pResId2 ) );
}
}
diff --git a/svx/source/inc/datanavi.hxx b/svx/source/inc/datanavi.hxx
index f1564fd..b165b9a 100644
--- a/svx/source/inc/datanavi.hxx
+++ b/svx/source/inc/datanavi.hxx
@@ -20,6 +20,7 @@
#define INCLUDED_SVX_SOURCE_INC_DATANAVI_HXX
#include <config_options.h>
#include <o3tl/sorted_vector.hxx>
#include <vcl/builderpage.hxx>
#include <vcl/idle.hxx>
#include <vcl/transfer.hxx>
@@ -184,9 +185,12 @@ namespace svxform
weld::Container* m_pParent;
std::unique_ptr<weld::Toolbar> m_xToolBox;
std::unique_ptr<weld::Menu> m_xMenu;
std::unique_ptr<weld::TreeView> m_xItemList;
std::unique_ptr<weld::TreeIter> m_xScratchIter;
o3tl::sorted_vector<OString> m_aRemovedMenuEntries;
DataTreeDropTarget m_aDropHelper;
css::uno::Reference< css::xforms::XFormsUIHelper1 >
@@ -220,6 +224,8 @@ namespace svxform
void DeleteAndClearTree();
void SetMenuEntrySensitive(const OString& rIdent, bool bSensitive);
public:
XFormsPage(weld::Container* pParent, DataNavigatorWindow* _pNaviWin, DataGroupType _eGroup);
virtual ~XFormsPage() override;
@@ -230,7 +236,7 @@ namespace svxform
OUString LoadInstance(const css::uno::Sequence< css::beans::PropertyValue >& _xPropSeq);
bool DoMenuAction(std::string_view rMenuID);
void EnableMenuItems(weld::Menu* pMenu);
void EnableMenuItems();
const OUString& GetInstanceName() const { return m_sInstanceName; }
const OUString& GetInstanceURL() const { return m_sInstanceURL; }