1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
3 * This file is part of the LibreOffice project.
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/.
9 * This file incorporates work covered by the following license notice:
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 .
20 #include <sal/config.h>
22 #include <vcl/commandinfoprovider.hxx>
23 #include <vcl/event.hxx>
24 #include <vcl/weld.hxx>
25 #include <vcl/svapp.hxx>
31 #include <strings.hrc>
34 #include <SvxNotebookbarConfigPage.hxx>
35 #include <SvxConfigPageHelper.hxx>
36 #include <dialmgr.hxx>
37 #include <libxml/parser.h>
38 #include <osl/file.hxx>
39 #include <CustomNotebookbarGenerator.hxx>
40 #include <sfx2/notebookbar/SfxNotebookBar.hxx>
41 #include <unotools/configmgr.hxx>
42 #include <comphelper/processfactory.hxx>
43 #include <com/sun/star/frame/theUICommandDescription.hpp>
44 #include <com/sun/star/ui/ImageType.hpp>
46 namespace uno
= com::sun::star::uno
;
47 namespace frame
= com::sun::star::frame
;
48 namespace lang
= com::sun::star::lang
;
49 namespace container
= com::sun::star::container
;
50 namespace beans
= com::sun::star::beans
;
51 namespace graphic
= com::sun::star::graphic
;
53 static bool isCategoryAvailable(const OUString
& sClassId
, const OUString
& sUIItemId
,
54 const OUString
& sActiveCategory
, bool& isCategory
)
56 if (sUIItemId
== sActiveCategory
)
58 else if ((sClassId
== "GtkMenu" || sClassId
== "GtkGrid") && sUIItemId
!= sActiveCategory
)
66 static OUString
charToString(const char* cString
)
68 OUStringBuffer aString
;
69 for (std::size_t i
= 0; i
< strlen(cString
); i
++)
71 aString
.append(cString
[i
]);
73 return aString
.makeStringAndClear();
76 static OUString
getFileName(const OUString
& aFileName
)
78 if (aFileName
== "notebookbar.ui")
80 else if (aFileName
== "notebookbar_compact.ui")
81 return "TabbedCompact";
82 else if (aFileName
== "notebookbar_groupedbar_full.ui")
84 else if (aFileName
== "notebookbar_groupedbar_compact.ui")
85 return "GroupedbarCompact";
90 static OUString
getModuleId(const OUString
& sModuleName
)
92 if (sModuleName
== "Writer")
93 return "com.sun.star.text.TextDocument";
94 else if (sModuleName
== "Draw")
95 return "com.sun.star.drawing.DrawingDocument";
96 else if (sModuleName
== "Impress")
97 return "com.sun.star.presentation.PresentationDocument";
98 else if (sModuleName
== "Calc")
99 return "com.sun.star.sheet.SpreadsheetDocument";
104 SvxNotebookbarConfigPage::SvxNotebookbarConfigPage(weld::Container
* pPage
,
105 weld::DialogController
* pController
,
106 const SfxItemSet
& rSet
)
107 : SvxConfigPage(pPage
, pController
, rSet
)
109 m_xCommandCategoryListBox
->set_visible(false);
110 m_xDescriptionFieldLb
->set_visible(false);
111 m_xSearchEdit
->set_visible(false);
112 m_xDescriptionField
->set_visible(false);
113 m_xMoveUpButton
->set_visible(false);
114 m_xMoveDownButton
->set_visible(false);
115 m_xAddCommandButton
->set_visible(false);
116 m_xRemoveCommandButton
->set_visible(false);
117 m_xLeftFunctionLabel
->set_visible(false);
118 m_xSearchLabel
->set_visible(false);
119 m_xCategoryLabel
->set_visible(false);
120 m_xInsertBtn
->set_visible(false);
121 m_xModifyBtn
->set_visible(false);
122 m_xResetBtn
->set_visible(false);
123 m_xCustomizeLabel
->set_visible(false);
125 weld::TreeView
& rCommandCategoryBox
= m_xFunctions
->get_widget();
126 rCommandCategoryBox
.hide();
128 m_xContentsListBox
.reset(
129 new SvxNotebookbarEntriesListBox(m_xBuilder
->weld_tree_view("toolcontents"), this));
130 std::vector
<int> aWidths
;
131 weld::TreeView
& rTreeView
= m_xContentsListBox
->get_widget();
132 Size
aSize(m_xFunctions
->get_size_request());
133 rTreeView
.set_size_request(aSize
.Width(), aSize
.Height());
135 int nExpectedSize
= 16;
137 int nStandardImageColWidth
= rTreeView
.get_checkbox_column_width();
138 int nMargin
= nStandardImageColWidth
- nExpectedSize
;
142 if (SvxConfigPageHelper::GetImageType() & css::ui::ImageType::SIZE_LARGE
)
144 else if (SvxConfigPageHelper::GetImageType() & css::ui::ImageType::SIZE_32
)
147 int nImageColWidth
= nExpectedSize
+ nMargin
;
149 aWidths
.push_back(nStandardImageColWidth
);
150 aWidths
.push_back(nImageColWidth
);
151 rTreeView
.set_column_fixed_widths(aWidths
);
153 rTreeView
.set_hexpand(true);
154 rTreeView
.set_vexpand(true);
155 rTreeView
.set_help_id(HID_SVX_CONFIG_NOTEBOOKBAR_CONTENTS
);
159 SvxNotebookbarConfigPage::~SvxNotebookbarConfigPage() {}
161 void SvxNotebookbarConfigPage::DeleteSelectedTopLevel() {}
163 void SvxNotebookbarConfigPage::DeleteSelectedContent() {}
165 void SvxNotebookbarConfigPage::Init()
167 m_xTopLevelListBox
->clear();
168 m_xContentsListBox
->clear();
169 m_xSaveInListBox
->clear();
170 CustomNotebookbarGenerator::createCustomizedUIFile();
171 OUString sAppName
, sFileName
;
172 CustomNotebookbarGenerator::getFileNameAndAppName(sAppName
, sFileName
);
173 OUString sNotebookbarInterface
= getFileName(sFileName
);
176 = utl::ConfigManager::getProductName() + " " + sAppName
+ " - " + sNotebookbarInterface
;
177 OUString sSaveInListBoxID
= notebookbarTabScope
;
179 m_xSaveInListBox
->append(sSaveInListBoxID
, sScopeName
);
180 m_xSaveInListBox
->set_active_id(sSaveInListBoxID
);
182 m_xTopLevelListBox
->append("NotebookBar", "All Commands");
183 m_xTopLevelListBox
->set_active_id("NotebookBar");
187 SaveInData
* SvxNotebookbarConfigPage::CreateSaveInData(
188 const css::uno::Reference
<css::ui::XUIConfigurationManager
>& xCfgMgr
,
189 const css::uno::Reference
<css::ui::XUIConfigurationManager
>& xParentCfgMgr
,
190 const OUString
& aModuleId
, bool bDocConfig
)
192 return static_cast<SaveInData
*>(
193 new ToolbarSaveInData(xCfgMgr
, xParentCfgMgr
, aModuleId
, bDocConfig
));
196 void SvxNotebookbarConfigPage::UpdateButtonStates() {}
198 short SvxNotebookbarConfigPage::QueryReset()
200 OUString msg
= CuiResId(RID_SVXSTR_CONFIRM_TOOLBAR_RESET
);
202 OUString saveInName
= m_xSaveInListBox
->get_active_text();
204 OUString label
= SvxConfigPageHelper::replaceSaveInName(msg
, saveInName
);
206 std::unique_ptr
<weld::MessageDialog
> xQueryBox(Application::CreateMessageDialog(
207 GetFrameWeld(), VclMessageType::Question
, VclButtonsType::YesNo
, label
));
208 int nValue
= xQueryBox
->run();
209 if (nValue
== RET_YES
)
211 OUString sOriginalUIPath
= CustomNotebookbarGenerator::getOriginalUIPath();
212 OUString sCustomizedUIPath
= CustomNotebookbarGenerator::getCustomizedUIPath();
213 osl::File::copy(sOriginalUIPath
, sCustomizedUIPath
);
214 OUString sAppName
, sFileName
;
215 CustomNotebookbarGenerator::getFileNameAndAppName(sAppName
, sFileName
);
216 OUString sNotebookbarInterface
= getFileName(sFileName
);
217 Sequence
<OUString
> sSequenceEntries
;
218 CustomNotebookbarGenerator::setCustomizedUIItem(sSequenceEntries
, sNotebookbarInterface
);
219 OUString sUIPath
= "modules/s" + sAppName
.toAsciiLowerCase() + "/ui/";
220 sfx2::SfxNotebookBar::ReloadNotebookBar(sUIPath
);
225 void SvxConfigPage::InsertEntryIntoNotebookbarTabUI(const OUString
& sClassId
,
226 const OUString
& sUIItemId
,
227 const OUString
& sUIItemCommand
, int nPos
,
230 OUString sAppName
, sFileName
;
231 CustomNotebookbarGenerator::getFileNameAndAppName(sAppName
, sFileName
);
233 css::uno::Reference
<css::container::XNameAccess
> m_xCommandToLabelMap
,
234 m_xGlobalCommandToLabelMap
;
235 uno::Reference
<uno::XComponentContext
> xContext
= ::comphelper::getProcessComponentContext();
236 uno::Reference
<container::XNameAccess
> xNameAccess(
237 css::frame::theUICommandDescription::get(xContext
));
239 uno::Sequence
<beans::PropertyValue
> aPropSeq
, aGlobalPropSeq
;
241 xNameAccess
->getByName("com.sun.star.text.GlobalDocument") >>= m_xGlobalCommandToLabelMap
;
242 xNameAccess
->getByName(getModuleId(sAppName
)) >>= m_xCommandToLabelMap
;
246 uno::Any aModuleVal
= m_xCommandToLabelMap
->getByName(sUIItemCommand
);
248 aModuleVal
>>= aPropSeq
;
250 catch (container::NoSuchElementException
&)
256 uno::Any aGlobalVal
= m_xGlobalCommandToLabelMap
->getByName(sUIItemCommand
);
257 aGlobalVal
>>= aGlobalPropSeq
;
259 catch (container::NoSuchElementException
&)
264 for (sal_Int32 i
= 0; i
< aPropSeq
.getLength(); ++i
)
265 if (aPropSeq
[i
].Name
== "Name")
266 aPropSeq
[i
].Value
>>= aLabel
;
267 if (aLabel
.isEmpty())
268 for (sal_Int32 i
= 0; i
< aGlobalPropSeq
.getLength(); ++i
)
269 if (aGlobalPropSeq
[i
].Name
== "Name")
270 aGlobalPropSeq
[i
].Value
>>= aLabel
;
272 OUString aName
= SvxConfigPageHelper::stripHotKey(aLabel
);
274 if (sClassId
== "GtkSeparatorMenuItem" || sClassId
== "GtkSeparator")
276 OUString sDataInTree
= "--------------------------------------------";
277 m_xContentsListBox
->set_text(nPos
, sDataInTree
, nStartCol
+ 1);
283 auto xImage
= GetSaveInData()->GetImage(sUIItemCommand
);
285 m_xContentsListBox
->set_image(nPos
, xImage
, nStartCol
);
286 m_xContentsListBox
->set_text(nPos
, aName
, nStartCol
+ 1);
287 m_xContentsListBox
->set_id(nPos
, sUIItemId
);
291 void SvxNotebookbarConfigPage::getNodeValue(xmlNode
* pNodePtr
, NotebookbarEntries
& aNodeEntries
)
293 pNodePtr
= pNodePtr
->xmlChildrenNode
;
296 if (!(xmlStrcmp(pNodePtr
->name
, reinterpret_cast<const xmlChar
*>("property"))))
298 xmlChar
* UriValue
= xmlGetProp(pNodePtr
, reinterpret_cast<const xmlChar
*>("name"));
299 if (!(xmlStrcmp(UriValue
, reinterpret_cast<const xmlChar
*>("visible"))))
301 xmlChar
* aValue
= xmlNodeGetContent(pNodePtr
);
302 const char* cVisibleValue
= reinterpret_cast<const char*>(aValue
);
303 OUString sVisibleValue
= charToString(cVisibleValue
);
304 aNodeEntries
.sVisibleValue
= sVisibleValue
;
307 if (!(xmlStrcmp(UriValue
, reinterpret_cast<const xmlChar
*>("action_name"))))
309 xmlChar
* aValue
= xmlNodeGetContent(pNodePtr
);
310 const char* cActionName
= reinterpret_cast<const char*>(aValue
);
311 OUString sActionName
= charToString(cActionName
);
312 aNodeEntries
.sActionName
= sActionName
;
317 pNodePtr
= pNodePtr
->next
;
321 void SvxNotebookbarConfigPage::searchNodeandAttribute(std::vector
<NotebookbarEntries
>& aEntries
,
322 std::vector
<CategoriesEntries
>& aCategoryList
,
323 OUString
& sActiveCategory
,
324 CategoriesEntries
& aCurItemEntry
,
325 xmlNode
* pNodePtr
, bool isCategory
)
327 pNodePtr
= pNodePtr
->xmlChildrenNode
;
330 if (pNodePtr
->type
== XML_ELEMENT_NODE
)
332 const char* cNodeName
= reinterpret_cast<const char*>(pNodePtr
->name
);
333 OUString sNodeName
= charToString(cNodeName
);
335 if (sNodeName
== "object")
337 xmlChar
* UriValue
= xmlGetProp(pNodePtr
, reinterpret_cast<const xmlChar
*>("id"));
338 const char* cUIItemID
= reinterpret_cast<const char*>(UriValue
);
339 OUString sUIItemId
= charToString(cUIItemID
);
342 UriValue
= xmlGetProp(pNodePtr
, reinterpret_cast<const xmlChar
*>("class"));
343 const char* cClassId
= reinterpret_cast<const char*>(UriValue
);
344 OUString sClassId
= charToString(cClassId
);
347 CategoriesEntries aCategoryEntry
;
348 if (sClassId
== "sfxlo-PriorityHBox")
350 aCategoryEntry
.sDisplayName
= sUIItemId
;
351 aCategoryEntry
.sUIItemId
= sUIItemId
;
352 aCategoryEntry
.sClassType
= sClassId
;
353 aCategoryList
.push_back(aCategoryEntry
);
355 aCurItemEntry
= aCategoryEntry
;
357 else if (sClassId
== "sfxlo-PriorityMergedHBox")
359 aCategoryEntry
.sDisplayName
= aCurItemEntry
.sDisplayName
+ " | " + sUIItemId
;
360 aCategoryEntry
.sUIItemId
= sUIItemId
;
361 aCategoryEntry
.sClassType
= sClassId
;
363 if (aCurItemEntry
.sClassType
== sClassId
)
366 aCategoryEntry
.sDisplayName
367 = aCurItemEntry
.sDisplayName
.getToken(rPos
, ' ', rPos
) + " | "
370 aCategoryList
.push_back(aCategoryEntry
);
371 aCurItemEntry
= aCategoryEntry
;
373 else if (sClassId
== "svtlo-ManagedMenuButton")
376 sSecondVal
= sUIItemId
.getToken(rPos
, ':', rPos
);
377 if (!sSecondVal
.isEmpty())
379 aCategoryEntry
.sDisplayName
380 = aCurItemEntry
.sDisplayName
+ " | " + sSecondVal
;
381 aCategoryEntry
.sUIItemId
= sSecondVal
;
382 aCategoryList
.push_back(aCategoryEntry
);
386 NotebookbarEntries nodeEntries
;
387 if (isCategoryAvailable(sClassId
, sUIItemId
, sActiveCategory
, isCategory
)
391 if (sClassId
== "GtkMenuItem" || sClassId
== "GtkToolButton"
392 || sClassId
== "GtkMenuToolButton"
393 || (sClassId
== "svtlo-ManagedMenuButton" && sSecondVal
.isEmpty()))
395 nodeEntries
.sClassId
= sClassId
;
396 nodeEntries
.sUIItemId
= sUIItemId
;
397 nodeEntries
.sDisplayName
= sUIItemId
;
399 getNodeValue(pNodePtr
, nodeEntries
);
400 aEntries
.push_back(nodeEntries
);
402 else if (sClassId
== "GtkSeparatorMenuItem" || sClassId
== "GtkSeparator")
404 nodeEntries
.sClassId
= sClassId
;
405 nodeEntries
.sUIItemId
= sUIItemId
;
406 nodeEntries
.sDisplayName
= "Null";
407 nodeEntries
.sVisibleValue
= "Null";
408 nodeEntries
.sActionName
= "Null";
409 aEntries
.push_back(nodeEntries
);
411 else if (sClassId
== "sfxlo-PriorityHBox"
412 || sClassId
== "sfxlo-PriorityMergedHBox"
413 || sClassId
== "svtlo-ManagedMenuButton")
415 nodeEntries
.sClassId
= sClassId
;
416 nodeEntries
.sUIItemId
= sUIItemId
;
417 nodeEntries
.sDisplayName
418 = aCategoryList
[aCategoryList
.size() - 1].sDisplayName
;
419 nodeEntries
.sVisibleValue
= "Null";
420 nodeEntries
.sActionName
= "Null";
421 aEntries
.push_back(nodeEntries
);
425 searchNodeandAttribute(aEntries
, aCategoryList
, sActiveCategory
, aCurItemEntry
,
426 pNodePtr
, isCategory
);
428 pNodePtr
= pNodePtr
->next
;
432 void SvxNotebookbarConfigPage::FillFunctionsList(std::vector
<NotebookbarEntries
>& aEntries
,
433 std::vector
<CategoriesEntries
>& aCategoryList
,
434 OUString
& sActiveCategory
)
438 OUString sUIFilePath
= CustomNotebookbarGenerator::getCustomizedUIPath();
439 char* cUIFileUIPath
= CustomNotebookbarGenerator::convertToCharPointer(sUIFilePath
);
440 pDoc
= xmlParseFile(cUIFileUIPath
);
441 pNodePtr
= xmlDocGetRootElement(pDoc
);
443 CategoriesEntries aCurItemEntry
;
444 searchNodeandAttribute(aEntries
, aCategoryList
, sActiveCategory
, aCurItemEntry
, pNodePtr
,
450 delete[] cUIFileUIPath
;
453 void SvxNotebookbarConfigPage::SelectElement()
455 m_xContentsListBox
->clear();
456 std::vector
<NotebookbarEntries
> aEntries
;
457 std::vector
<CategoriesEntries
> aCategoryList
;
458 OUString sActiveCategory
= m_xTopLevelListBox
->get_active_id();
459 FillFunctionsList(aEntries
, aCategoryList
, sActiveCategory
);
461 if (m_xTopLevelListBox
->get_count() == 1)
463 for (std::size_t nIdx
= 0; nIdx
< aCategoryList
.size(); nIdx
++)
464 m_xTopLevelListBox
->append(aCategoryList
[nIdx
].sUIItemId
,
465 aCategoryList
[nIdx
].sDisplayName
);
467 unsigned long nStart
= 0;
468 if (aEntries
[nStart
].sClassId
== "sfxlo-PriorityHBox"
469 || aEntries
[nStart
].sClassId
== "sfxlo-PriorityMergedHBox")
472 std::vector
<NotebookbarEntries
> aTempEntries
;
473 for (std::size_t nIdx
= nStart
; nIdx
< aEntries
.size(); nIdx
++)
475 if (aEntries
[nIdx
].sClassId
== "svtlo-ManagedMenuButton")
477 aTempEntries
.push_back(aEntries
[nIdx
]);
478 std::vector
<NotebookbarEntries
> aGtkEntries
;
480 sActiveCategory
= aEntries
[nIdx
].sUIItemId
.getToken(rPos
, ':', rPos
);
481 FillFunctionsList(aGtkEntries
, aCategoryList
, sActiveCategory
);
482 for (std::size_t Idx
= 0; Idx
< aGtkEntries
.size(); Idx
++)
483 aTempEntries
.push_back(aGtkEntries
[Idx
]);
487 aTempEntries
.push_back(aEntries
[nIdx
]);
490 aEntries
= aTempEntries
;
491 aTempEntries
.clear();
494 for (std::size_t nIdx
= 0; nIdx
< aEntries
.size(); nIdx
++)
496 OUString
sId(OUString::number(nId
));
497 m_xContentsListBox
->insert(nIdx
, sId
);
498 if (aEntries
[nIdx
].sActionName
!= "Null")
500 if (aEntries
[nIdx
].sVisibleValue
== "True")
502 m_xContentsListBox
->set_toggle(nIdx
, TRISTATE_TRUE
, 0);
506 m_xContentsListBox
->set_toggle(nIdx
, TRISTATE_FALSE
, 0);
509 InsertEntryIntoNotebookbarTabUI(aEntries
[nIdx
].sClassId
, aEntries
[nIdx
].sDisplayName
,
510 aEntries
[nIdx
].sActionName
, nIdx
, 1);
516 SvxNotebookbarEntriesListBox::SvxNotebookbarEntriesListBox(std::unique_ptr
<weld::TreeView
> xParent
,
518 : SvxMenuEntriesListBox(std::move(xParent
), pPg
)
520 m_xControl
->connect_toggled(LINK(this, SvxNotebookbarEntriesListBox
, CheckButtonHdl
));
521 m_xControl
->connect_key_press(Link
<const KeyEvent
&, bool>());
522 m_xControl
->connect_key_press(LINK(this, SvxNotebookbarEntriesListBox
, KeyInputHdl
));
525 SvxNotebookbarEntriesListBox::~SvxNotebookbarEntriesListBox() {}
527 static void EditRegistryFile(const OUString
& sUIItemId
, const OUString
& sSetEntry
,
528 const OUString
& sNotebookbarInterface
)
531 Sequence
<OUString
> aOldEntries
532 = CustomNotebookbarGenerator::getCustomizedUIItem(sNotebookbarInterface
);
533 Sequence
<OUString
> aNewEntries(aOldEntries
.getLength() + 1);
534 for (int nIdx
= 0; nIdx
< aOldEntries
.getLength(); nIdx
++)
537 OUString sFirstValue
= aOldEntries
[nIdx
].getToken(rPos
, ',', rPos
);
538 if (sFirstValue
== sUIItemId
)
540 aOldEntries
[nIdx
] = sSetEntry
;
544 aNewEntries
[nIdx
] = aOldEntries
[nIdx
];
549 aNewEntries
[aOldEntries
.getLength()] = sSetEntry
;
550 CustomNotebookbarGenerator::setCustomizedUIItem(aNewEntries
, sNotebookbarInterface
);
554 CustomNotebookbarGenerator::setCustomizedUIItem(aOldEntries
, sNotebookbarInterface
);
558 void SvxNotebookbarEntriesListBox::ChangedVisibility(int nRow
)
560 OUString sUIItemId
= m_xControl
->get_selected_id();
563 CustomNotebookbarGenerator::getFileNameAndAppName(sAppName
, sFileName
);
564 OUString sNotebookbarInterface
= getFileName(sFileName
);
567 if (m_xControl
->get_toggle(nRow
, 0) == TRISTATE_TRUE
)
571 OUString sSetEntries
= sUIItemId
+ ",visible," + sVisible
;
572 Sequence
<OUString
> sSeqOfEntries(1);
573 sSeqOfEntries
[0] = sSetEntries
;
574 EditRegistryFile(sUIItemId
, sSetEntries
, sNotebookbarInterface
);
575 CustomNotebookbarGenerator::modifyCustomizedUIFile(sSeqOfEntries
);
576 OUString sUIPath
= "modules/s" + sAppName
.toAsciiLowerCase() + "/ui/";
577 sfx2::SfxNotebookBar::ReloadNotebookBar(sUIPath
);
580 IMPL_LINK(SvxNotebookbarEntriesListBox
, CheckButtonHdl
, const row_col
&, rRowCol
, void)
582 ChangedVisibility(rRowCol
.first
);
585 IMPL_LINK(SvxNotebookbarEntriesListBox
, KeyInputHdl
, const KeyEvent
&, rKeyEvent
, bool)
587 if (rKeyEvent
.GetKeyCode() == KEY_SPACE
)
589 int nRow
= m_xControl
->get_selected_index();
590 m_xControl
->set_toggle(
591 nRow
, m_xControl
->get_toggle(nRow
, 0) == TRISTATE_TRUE
? TRISTATE_FALSE
: TRISTATE_TRUE
,
593 ChangedVisibility(nRow
);
596 return SvxMenuEntriesListBox::KeyInputHdl(rKeyEvent
);
599 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */