LibreOffice Module cui (master)  1
SvxMenuConfigPage.cxx
Go to the documentation of this file.
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
3  * This file is part of the LibreOffice project.
4  *
5  * This Source Code Form is subject to the terms of the Mozilla Public
6  * License, v. 2.0. If a copy of the MPL was not distributed with this
7  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8  *
9  * This file incorporates work covered by the following license notice:
10  *
11  * Licensed to the Apache Software Foundation (ASF) under one or more
12  * contributor license agreements. See the NOTICE file distributed
13  * with this work for additional information regarding copyright
14  * ownership. The ASF licenses this file to you under the Apache
15  * License, Version 2.0 (the "License"); you may not use this file
16  * except in compliance with the License. You may obtain a copy of
17  * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18  */
19 
20 #include <sal/config.h>
21 #include <sal/log.hxx>
22 
24 #include <vcl/weld.hxx>
25 #include <vcl/svapp.hxx>
26 
27 #include <algorithm>
28 #include <strings.hrc>
29 #include <helpids.h>
30 
31 #include <cfg.hxx>
32 #include <SvxMenuConfigPage.hxx>
33 #include <SvxConfigPageHelper.hxx>
34 #include <dialmgr.hxx>
35 
37 #include <com/sun/star/ui/ImageType.hpp>
38 
39 #include <dlgname.hxx>
40 
42  : SvxConfigPage(pPage, pController, rSet)
43  , m_bIsMenuBar(bIsMenuBar)
44 {
45  m_xGearBtn = m_xBuilder->weld_menu_button("menugearbtn");
46  m_xGearBtn->show();
47  m_xContentsListBox.reset(new SvxMenuEntriesListBox(m_xBuilder->weld_tree_view("menucontents"), this));
48  weld::TreeView& rTreeView = m_xContentsListBox->get_widget();
49  m_xDropTargetHelper.reset(new SvxConfigPageFunctionDropTarget(*this, rTreeView));
50  rTreeView.connect_size_allocate(LINK(this, SvxMenuConfigPage, MenuEntriesSizeAllocHdl));
51  Size aSize(m_xFunctions->get_size_request());
52  rTreeView.set_size_request(aSize.Width(), aSize.Height());
53  MenuEntriesSizeAllocHdl(aSize);
54  rTreeView.set_hexpand(true);
55  rTreeView.set_vexpand(true);
56  rTreeView.show();
57 
58  rTreeView.connect_changed(
59  LINK( this, SvxMenuConfigPage, SelectMenuEntry ) );
60 
61  m_xGearBtn->connect_selected(LINK(this, SvxMenuConfigPage, GearHdl));
62 
63  m_xCommandCategoryListBox->connect_changed(LINK(this, SvxMenuConfigPage, SelectCategory));
64 
65  m_xMoveUpButton->connect_clicked( LINK( this, SvxConfigPage, MoveHdl) );
66  m_xMoveDownButton->connect_clicked( LINK( this, SvxConfigPage, MoveHdl) );
67 
68  m_xAddCommandButton->connect_clicked( LINK( this, SvxMenuConfigPage, AddCommandHdl ) );
69  m_xRemoveCommandButton->connect_clicked( LINK( this, SvxMenuConfigPage, RemoveCommandHdl ) );
70 
71  m_xInsertBtn->connect_selected(
72  LINK( this, SvxMenuConfigPage, InsertHdl ) );
73  m_xModifyBtn->connect_selected(
74  LINK( this, SvxMenuConfigPage, ModifyItemHdl ) );
75  m_xResetBtn->connect_clicked(
76  LINK( this, SvxMenuConfigPage, ResetMenuHdl ) );
77 
78  // These operations are not possible on menus/context menus yet
79  m_xModifyBtn->remove_item("changeIcon");
80  m_xModifyBtn->remove_item("resetIcon");
81  m_xModifyBtn->remove_item("restoreItem");
82 
83  if ( !bIsMenuBar )
84  {
85  //TODO: Remove this when the gear button is implemented for context menus
86  m_xGearBtn->set_sensitive(false);
87  m_xGearBtn->hide();
88  }
89  else
90  {
91  // TODO: Remove this when it is possible to reset menubar menus individually
92  m_xResetBtn->set_sensitive(false);
93  }
94 }
95 
97 {
98  // regenerate with the current ordering within the list
100  pEntries->clear();
101 
102  for (int i = 0; i < m_xContentsListBox->n_children(); ++i)
103  pEntries->push_back(reinterpret_cast<SvxConfigEntry*>(m_xContentsListBox->get_id(i).toInt64()));
104 
108 }
109 
110 IMPL_LINK(SvxMenuConfigPage, MenuEntriesSizeAllocHdl, const Size&, rSize, void)
111 {
112  weld::TreeView& rTreeView = m_xContentsListBox->get_widget();
113  std::vector<int> aWidths;
114 
115  int nExpectedSize = 16;
116 
117  int nStandardImageColWidth = rTreeView.get_checkbox_column_width();
118  int nMargin = nStandardImageColWidth - nExpectedSize;
119  if (nMargin < 16)
120  nMargin = 16;
121 
122  if (SvxConfigPageHelper::GetImageType() & css::ui::ImageType::SIZE_LARGE)
123  nExpectedSize = 24;
124  else if (SvxConfigPageHelper::GetImageType() & css::ui::ImageType::SIZE_32)
125  nExpectedSize = 32;
126 
127  int nImageColWidth = nExpectedSize + nMargin;
128 
129  aWidths.push_back(nImageColWidth);
130  aWidths.push_back(rSize.Width() - (nImageColWidth + nStandardImageColWidth));
131  rTreeView.set_column_fixed_widths(aWidths);
132 }
133 
135 {
136  for (int i = 0, nCount = m_xSaveInListBox->get_count(); i < nCount; ++i)
137  delete reinterpret_cast<SaveInData*>(m_xSaveInListBox->get_id(i).toInt64());
138  m_xSaveInListBox->clear();
139 }
140 
141 // Populates the Menu combo box
143 {
144  // ensure that the UI is cleared before populating it
145  m_xTopLevelListBox->clear();
146  m_xContentsListBox->clear();
147 
149 
150  m_xTopLevelListBox->set_active(0);
151  SelectElement();
152 
155  m_xFrame,
157  m_xCommandCategoryListBox->categorySelected(m_xFunctions.get(), OUString(), GetSaveInData());
158 }
159 
161 {
162  UpdateButtonStates();
163 }
164 
166 {
167  // Disable Up and Down buttons depending on current selection
168  int selection = m_xContentsListBox->get_selected_index();
169 
170  bool bIsSeparator =
171  selection != -1 && reinterpret_cast<SvxConfigEntry*>(m_xContentsListBox->get_id(selection).toInt64())->IsSeparator();
172  bool bIsValidSelection =
173  !(m_xContentsListBox->n_children() == 0 || selection == -1);
174 
175  m_xMoveUpButton->set_sensitive(
176  bIsValidSelection && selection != 0 );
177  m_xMoveDownButton->set_sensitive(
178  bIsValidSelection && selection != m_xContentsListBox->n_children() - 1);
179 
180  m_xRemoveCommandButton->set_sensitive( bIsValidSelection );
181 
182  m_xModifyBtn->set_sensitive( bIsValidSelection && !bIsSeparator);
183 
184  // If there is no top level selection (menu), then everything working on the right box
185  // which contains the functions of the selected menu/toolbar needs to be disabled
186  SvxConfigEntry* pMenuData = GetTopLevelSelection();
187 
188  m_xInsertBtn->set_sensitive(pMenuData != nullptr);
189 
190  m_xAddCommandButton->set_sensitive(pMenuData != nullptr);
191  m_xRemoveCommandButton->set_sensitive(pMenuData != nullptr);
192 
193  //Handle the gear button
194  if (pMenuData && m_bIsMenuBar)
195  {
196  // Add option (gear_add) will always be enabled
197  m_xGearBtn->set_item_sensitive( "menu_gear_delete", pMenuData->IsDeletable() );
198  m_xGearBtn->set_item_sensitive( "menu_gear_rename", pMenuData->IsRenamable() );
199  m_xGearBtn->set_item_sensitive( "menu_gear_move", pMenuData->IsMovable() );
200  }
201 }
202 
204 {
205  SvxConfigEntry* pMenuData = GetTopLevelSelection();
206 
207  SvxEntries* pParentEntries =
208  FindParentForChild( GetSaveInData()->GetEntries(), pMenuData );
209 
210  SvxConfigPageHelper::RemoveEntry( pParentEntries, pMenuData );
211  delete pMenuData;
212 
214 
216 }
217 
219 {
220  int nActEntry = m_xContentsListBox->get_selected_index();
221 
222  if (nActEntry != -1)
223  {
224  // get currently selected menu entry
225  SvxConfigEntry* pMenuEntry =
226  reinterpret_cast<SvxConfigEntry*>(m_xContentsListBox->get_id(nActEntry).toInt64());
227 
228  // get currently selected menu
230 
231  // remove menu entry from the list for this menu
232  SvxConfigPageHelper::RemoveEntry( pMenu->GetEntries(), pMenuEntry );
233 
234  // remove menu entry from UI
235  m_xContentsListBox->remove(nActEntry);
236 
237  // if this is a submenu entry, redraw the menus list box
238  if ( pMenuEntry->IsPopup() )
239  {
241  }
242 
243  // delete data for menu entry
244  delete pMenuEntry;
245 
247  pMenu->SetModified();
248  }
249 }
250 
252 {
253  OUString msg = CuiResId( RID_SVXSTR_CONFIRM_MENU_RESET );
254 
255  OUString saveInName = m_xSaveInListBox->get_active_text();
256 
257  OUString label = SvxConfigPageHelper::replaceSaveInName( msg, saveInName );
258 
259  std::unique_ptr<weld::MessageDialog> xQueryBox(Application::CreateMessageDialog(GetFrameWeld(),
260  VclMessageType::Question, VclButtonsType::YesNo,
261  label));
262  return xQueryBox->run();
263 }
264 
266 {
267  m_xContentsListBox->clear();
268 
269  SvxConfigEntry* pMenuData = GetTopLevelSelection();
270 
271  if ( pMenuData )
272  {
273  SvxEntries* pEntries = pMenuData->GetEntries();
274 
275  int i = 0;
276  for (auto const& entry : *pEntries)
277  {
278  OUString sId(OUString::number(reinterpret_cast<sal_Int64>(entry)));
279  m_xContentsListBox->insert(i, sId);
280  InsertEntryIntoUI(entry, i, 0);
281  ++i;
282  }
283  }
284 
286 }
287 
288 IMPL_LINK(SvxMenuConfigPage, GearHdl, const OString&, rIdent, void)
289 {
290  if (rIdent == "menu_gear_add")
291  {
293  GetSaveInData()->GetEntries(), nullptr, true );
294 
295  if (aDialog.run() == RET_OK)
296  {
297  GetSaveInData()->SetEntries(aDialog.ReleaseEntries());
298  ReloadTopLevelListBox(aDialog.GetSelectedEntry());
299  GetSaveInData()->SetModified();
300  }
301  }
302  else if (rIdent == "menu_gear_delete")
303  {
304  DeleteSelectedTopLevel();
305  }
306  else if (rIdent == "menu_gear_rename")
307  {
308  SvxConfigEntry* pMenuData = GetTopLevelSelection();
309 
310  OUString sCurrentName( SvxConfigPageHelper::stripHotKey( pMenuData->GetName() ) );
311  OUString sDesc = CuiResId( RID_SVXSTR_LABEL_NEW_NAME );
312 
313  SvxNameDialog aNameDialog(GetFrameWeld(), sCurrentName, sDesc);
315  aNameDialog.set_title(CuiResId(RID_SVXSTR_RENAME_MENU));
316 
317  if ( aNameDialog.run() == RET_OK )
318  {
319  OUString sNewName = aNameDialog.GetName();
320 
321  if ( sCurrentName == sNewName )
322  return;
323 
324  pMenuData->SetName( sNewName );
325 
326  ReloadTopLevelListBox();
327 
328  GetSaveInData()->SetModified();
329  }
330  }
331  else if (rIdent == "menu_gear_move")
332  {
333  SvxConfigEntry* pMenuData = GetTopLevelSelection();
334 
335  SvxMainMenuOrganizerDialog aDialog(GetFrameWeld(), GetSaveInData()->GetEntries(),
336  pMenuData, false );
337  if (aDialog.run() == RET_OK)
338  {
339  GetSaveInData()->SetEntries(aDialog.ReleaseEntries());
340 
341  ReloadTopLevelListBox();
342 
343  GetSaveInData()->SetModified();
344  }
345  }
346  else
347  {
348  //This block should never be reached
349  SAL_WARN("cui.customize", "Unknown gear menu option: " << rIdent);
350  return;
351  }
352 
353  UpdateButtonStates();
354 }
355 
357 {
358  OUString aSearchTerm( m_xSearchEdit->get_text() );
359 
360  m_xCommandCategoryListBox->categorySelected(m_xFunctions.get(), aSearchTerm, GetSaveInData());
361 }
362 
364 {
365  int nPos = AddFunction(-1, /*bAllowDuplicates*/false);
366  if (nPos == -1)
367  return;
368  SvxConfigEntry* pEntry =
369  reinterpret_cast<SvxConfigEntry*>(m_xContentsListBox->get_id(nPos).toInt64());
370  InsertEntryIntoUI(pEntry, nPos, 0);
371 }
372 
373 IMPL_LINK_NOARG( SvxMenuConfigPage, RemoveCommandHdl, weld::Button&, void )
374 {
375  DeleteSelectedContent();
376  if ( GetSaveInData()->IsModified() )
377  {
378  UpdateButtonStates();
379  }
380 }
381 
382 IMPL_LINK(SvxMenuConfigPage, InsertHdl, const OString&, rIdent, void)
383 {
384  if (rIdent == "insertseparator")
385  {
386  SvxConfigEntry* pNewEntryData = new SvxConfigEntry;
387  pNewEntryData->SetUserDefined();
388  int nPos = AppendEntry(pNewEntryData, -1);
389  InsertEntryIntoUI(pNewEntryData, nPos, 0);
390  }
391  else if (rIdent == "insertsubmenu")
392  {
393  OUString aNewName;
394  OUString aDesc = CuiResId( RID_SVXSTR_SUBMENU_NAME );
395 
396  SvxNameDialog aNameDialog(GetFrameWeld(), aNewName, aDesc);
398  aNameDialog.set_title(CuiResId( RID_SVXSTR_ADD_SUBMENU));
399 
400  if (aNameDialog.run() == RET_OK)
401  {
402  aNewName = aNameDialog.GetName();
403 
404  SvxConfigEntry* pNewEntryData =
405  new SvxConfigEntry( aNewName, aNewName, true, /*bParentData*/false );
406  pNewEntryData->SetName( aNewName );
407  pNewEntryData->SetUserDefined();
408 
409  int nPos = AppendEntry(pNewEntryData, -1);
410  InsertEntryIntoUI(pNewEntryData, nPos, 0);
411 
412  ReloadTopLevelListBox();
413 
414  m_xContentsListBox->scroll_to_row(nPos);
415  m_xContentsListBox->select(nPos);
416 
417  GetSaveInData()->SetModified();
418  }
419 
420  }
421  else
422  {
423  //This block should never be reached
424  SAL_WARN("cui.customize", "Unknown insert option: " << rIdent);
425  return;
426  }
427 
428  if ( GetSaveInData()->IsModified() )
429  {
430  UpdateButtonStates();
431  }
432 }
433 
434 IMPL_LINK(SvxMenuConfigPage, ModifyItemHdl, const OString&, rIdent, void)
435 {
436  if (rIdent == "renameItem")
437  {
438  int nActEntry = m_xContentsListBox->get_selected_index();
439  SvxConfigEntry* pEntry =
440  reinterpret_cast<SvxConfigEntry*>(m_xContentsListBox->get_id(nActEntry).toInt64());
441 
442  OUString aNewName( SvxConfigPageHelper::stripHotKey( pEntry->GetName() ) );
443  OUString aDesc = CuiResId( RID_SVXSTR_LABEL_NEW_NAME );
444 
445  SvxNameDialog aNameDialog(GetFrameWeld(), aNewName, aDesc);
447  aNameDialog.set_title(CuiResId(RID_SVXSTR_RENAME_MENU));
448 
449  if (aNameDialog.run() == RET_OK)
450  {
451  aNewName = aNameDialog.GetName();
452 
453  pEntry->SetName( aNewName );
454  m_xContentsListBox->set_text(nActEntry, aNewName, 1);
455 
456  GetSaveInData()->SetModified();
457  GetTopLevelSelection()->SetModified();
458  }
459  }
460  else
461  {
462  //This block should never be reached
463  SAL_WARN("cui.customize", "Unknown insert option: " << rIdent);
464  return;
465  }
466 
467  if ( GetSaveInData()->IsModified() )
468  {
469  UpdateButtonStates();
470  }
471 }
472 
474 {
475  SvxConfigEntry* pMenuData = GetTopLevelSelection();
476 
477  if (pMenuData == nullptr)
478  {
479  SAL_WARN("cui.customize", "RHB top level selection is null. A menu must be selected to reset!");
480  return;
481  }
482 
483  std::unique_ptr<weld::MessageDialog> xQueryBox(Application::CreateMessageDialog(GetFrameWeld(),
484  VclMessageType::Question, VclButtonsType::YesNo,
485  CuiResId(RID_SVXSTR_CONFIRM_RESTORE_DEFAULT_MENU)));
486 
487  // Resetting individual top-level menus is not possible at the moment.
488  // So we are resetting only if it is a context menu
489  if (!m_bIsMenuBar && xQueryBox->run() == RET_YES)
490  {
491  sal_Int32 nPos = m_xTopLevelListBox->get_active();
492  ContextMenuSaveInData* pSaveInData = static_cast< ContextMenuSaveInData* >(GetSaveInData());
493 
494  pSaveInData->ResetContextMenu(pMenuData);
495 
496  // ensure that the UI is cleared before populating it
497  m_xTopLevelListBox->clear();
498  m_xContentsListBox->clear();
499 
500  ReloadTopLevelListBox();
501 
502  // Reselect the reset menu
503  m_xTopLevelListBox->set_active(nPos);
504  SelectElement();
505  }
506 }
507 
509  const css::uno::Reference< css::ui::XUIConfigurationManager >& xCfgMgr,
510  const css::uno::Reference< css::ui::XUIConfigurationManager >& xParentCfgMgr,
511  const OUString& aModuleId,
512  bool bDocConfig )
513 {
514  if ( !m_bIsMenuBar )
515  return static_cast< SaveInData* >( new ContextMenuSaveInData( xCfgMgr, xParentCfgMgr, aModuleId, bDocConfig ) );
516 
517  return static_cast< SaveInData* >( new MenuSaveInData( xCfgMgr, xParentCfgMgr, aModuleId, bDocConfig ) );
518 }
519 
520  /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
std::unique_ptr< CuiConfigFunctionListBox > m_xFunctions
Definition: cfg.hxx:388
SvxEntries * GetEntries() const
Definition: cfg.hxx:288
std::unique_ptr< weld::Button > m_xResetBtn
Definition: cfg.hxx:415
void set_title(const OUString &rTitle)
const OUString & GetName() const
Definition: cfg.hxx:276
std::unique_ptr< weld::MenuButton > m_xModifyBtn
Definition: cfg.hxx:413
std::unique_ptr< CommandCategoryListBox > m_xCommandCategoryListBox
Definition: cfg.hxx:387
std::unique_ptr< SvxEntries > ReleaseEntries()
Definition: cfg.hxx:528
static OUString stripHotKey(const OUString &str)
void SetModified(bool bValue=true)
Definition: cfg.hxx:297
IMPL_LINK(SvxMenuConfigPage, MenuEntriesSizeAllocHdl, const Size &, rSize, void)
std::unique_ptr< SvxConfigPageFunctionDropTarget > m_xDropTargetHelper
Definition: cfg.hxx:405
SvxMenuConfigPage(weld::Container *pPage, weld::DialogController *pController, const SfxItemSet &rItemSet, bool bIsMenuBar=true)
css::uno::Reference< css::frame::XFrame > m_xFrame
Definition: cfg.hxx:383
SaveInData * CreateSaveInData(const css::uno::Reference< css::ui::XUIConfigurationManager > &, const css::uno::Reference< css::ui::XUIConfigurationManager > &, const OUString &aModuleId, bool docConfig) override
SvxConfigEntry * GetTopLevelSelection()
Definition: cfg.hxx:483
static sal_Int16 GetImageType()
std::unique_ptr< weld::Button > m_xRemoveCommandButton
Definition: cfg.hxx:419
bool IsPopup() const
Definition: cfg.hxx:280
#define HID_SVX_CONFIG_RENAME_MENU_ITEM
Definition: helpids.h:34
void InsertEntryIntoUI(SvxConfigEntry *pNewEntryData, int nPos, int nStartCol)
Definition: cfg.cxx:1515
OUString GetName() const
Definition: dlgname.hxx:39
std::unique_ptr< SvxMenuEntriesListBox > m_xContentsListBox
Definition: cfg.hxx:404
void ReloadTopLevelListBox(SvxConfigEntry const *pSelection=nullptr)
Definition: cfg.cxx:1330
Dialog for editing a name.
Definition: dlgname.hxx:25
std::vector< SvxConfigEntry * > SvxEntries
Definition: cfg.hxx:60
std::unique_ptr< weld::ComboBox > m_xTopLevelListBox
Definition: cfg.hxx:401
bool IsRenamable() const
Definition: cfg.cxx:1877
void connect_changed(const Link< TreeView &, void > &rLink)
RET_YES
virtual void show()=0
static void RemoveEntry(SvxEntries *pEntries, SvxConfigEntry const *pChildEntry)
virtual void set_column_fixed_widths(const std::vector< int > &rWidths)=0
void SetName(const OUString &rStr)
Definition: cfg.hxx:277
virtual void set_vexpand(bool bExpand)=0
void Init() override
static OUString replaceSaveInName(const OUString &rMessage, const OUString &rSaveInName)
void DeleteSelectedTopLevel() override
virtual void ListModified() override
SvxEntries * FindParentForChild(SvxEntries *pParentEntries, SvxConfigEntry *pChildData)
Definition: cfg.cxx:1381
OUString GetModuleIdentifier(const Reference< frame::XFrame > &rxFrame)
IMPL_LINK_NOARG(SvxMenuConfigPage, SelectMenuEntry, weld::TreeView &, void)
#define HID_SVX_CONFIG_NAME_SUBMENU
Definition: helpids.h:32
void SetUserDefined(bool bOn=true)
Definition: cfg.hxx:282
int i
virtual void set_hexpand(bool bExpand)=0
void set_help_id(const OString &rHelpId)
bool IsMovable() const
Definition: cfg.cxx:1867
void ResetContextMenu(const SvxConfigEntry *pEntry)
Definition: cfg.cxx:894
short QueryReset() override
OUString CuiResId(const char *pKey)
Definition: cuiresmgr.cxx:23
std::unique_ptr< weld::MenuButton > m_xInsertBtn
Definition: cfg.hxx:412
int get_checkbox_column_width() const
weld::Window * GetFrameWeld() const
virtual void SelectElement() override
virtual void connect_size_allocate(const Link< const Size &, void > &rLink)
void SetModified(bool bValue=true)
Definition: cfg.hxx:124
void UpdateButtonStates() override
RET_OK
bool IsDeletable() const
Definition: cfg.cxx:1872
virtual short run()
Reference< XComponentContext > getProcessComponentContext()
#define HID_SVX_CONFIG_RENAME_MENU
Definition: helpids.h:33
static weld::MessageDialog * CreateMessageDialog(weld::Widget *pParent, VclMessageType eMessageType, VclButtonsType eButtonType, const OUString &rPrimaryMessage)
std::unique_ptr< weld::ComboBox > m_xSaveInListBox
Definition: cfg.hxx:410
SvxConfigEntry * GetSelectedEntry()
Definition: cfg.cxx:1828
std::unique_ptr< weld::Button > m_xMoveDownButton
Definition: cfg.hxx:408
#define SAL_WARN(area, stream)
std::unique_ptr< weld::Button > m_xMoveUpButton
Definition: cfg.hxx:407
def label(st)
std::unique_ptr< weld::MenuButton > m_xGearBtn
Definition: cfg.hxx:403
virtual void set_size_request(int nWidth, int nHeight)=0
sal_Int32 nPos
virtual ~SvxMenuConfigPage() override
weld::Window * GetFrameWeld(const SfxFrame *pFrame)
SaveInData * GetSaveInData()
Definition: cfg.hxx:466
void DeleteSelectedContent() override
std::unique_ptr< weld::Button > m_xAddCommandButton
Definition: cfg.hxx:418
OUString sId