Нужно скрыть элементы стандартных меню и панели

Автор proger1983, 1 декабря 2023, 13:00

0 Пользователи и 1 гость просматривают эту тему.

proger1983

приветствую, форумчане. никто не знает как программно скрыть элементы стандартных меню и панели? не целиком их, а именно отдельные элементы. макросом или настройкой расширения.

sokol92

#1
Речь идет о меню приложения, или о меню для конкретного документа?

Посмотрите здесь примеры от @Ratslinger.
Владимир.

proger1983

Цитата: sokol92 от  1 декабря 2023, 15:52Речь идет о меню приложения, или о меню для конкретного документа?

Посмотрите здесь примеры от @Ratslinger.
на уровне приложения (для writer, calc и impress)

sokol92

У нас была подобная тема на форуме.

Вот вариация на ту же тему.
В примере (временно, до перезагрузки LO) удаляется пункт главного меню.
Option Explicit
Const MenuResource As String="private:resource/menubar/menubar"
Const DocType As String="com.sun.star.sheet.SpreadsheetDocument"

' В Calc удаляем пункт "Показать совет дня"  (индекс 3) меню с индексом 10 ("Справка").
Sub test()
  RemoveMenuItem 10, 3
End Sub

' Удаление пунктов основного меню Calc.
' Параметры:
' PopupIx Индекс пункта главного меню (от 0)
' ItemIx  Индекс пункта вложенного меню (от 0)
Sub RemoveMenuItem  (Byval PopupIx As Long, _
                    Byval ItemIx  As  Long)
  Dim oCfgMng, Settings, ItemContainer, Item
  Dim Prop As New com.sun.star.beans.PropertyValue
  Dim i As Long, Exist As  Boolean
  oCfgMng=GetDefaultContext.getValueByName("/singletons/com.sun.star.ui.theModuleUIConfigurationManagerSupplier").getUIConfigurationManager(DocType)
  Settings = oCfgMng.getSettings(MenuResource, True)
  ItemContainer = getItemContainer (PopupIx, Settings)
  ItemContainer.removeByIndex ItemIx
  oCfgMng.replaceSettings MenuResource, Settings
End Sub

Function getItemContainer(ByVal PopupIndex As  Long, Byval Settings) As Object
  Dim Popup, i As Long
  Popup = Settings.getByIndex (PopupIndex)
  For i = 0 TO uBound (Popup)
    If Popup(i).Name = "ItemDescriptorContainer" Then
      getItemContainer = Popup(i).Value
      Exit Function
    End If
  Next i
End Function
Владимир.

proger1983

#4
Цитата: sokol92 от  4 декабря 2023, 18:49У нас была подобная тема на форуме.

Вот вариация на ту же тему.
В примере (временно, до перезагрузки LO) удаляется пункт главного меню.
Option Explicit
Const MenuResource As String="private:resource/menubar/menubar"
Const DocType As String="com.sun.star.sheet.SpreadsheetDocument"

' В Calc удаляем пункт "Показать совет дня"  (индекс 3) меню с индексом 10 ("Справка").
Sub test()
  RemoveMenuItem 10, 3
End Sub

' Удаление пунктов основного меню Calc.
' Параметры:
' PopupIx Индекс пункта главного меню (от 0)
' ItemIx  Индекс пункта вложенного меню (от 0)
Sub RemoveMenuItem  (Byval PopupIx As Long, _
                    Byval ItemIx  As  Long)
  Dim oCfgMng, Settings, ItemContainer, Item
  Dim Prop As New com.sun.star.beans.PropertyValue
  Dim i As Long, Exist As  Boolean
  oCfgMng=GetDefaultContext.getValueByName("/singletons/com.sun.star.ui.theModuleUIConfigurationManagerSupplier").getUIConfigurationManager(DocType)
  Settings = oCfgMng.getSettings(MenuResource, True)
  ItemContainer = getItemContainer (PopupIx, Settings)
  ItemContainer.removeByIndex ItemIx
  oCfgMng.replaceSettings MenuResource, Settings
End Sub

Function getItemContainer(ByVal PopupIndex As  Long, Byval Settings) As Object
  Dim Popup, i As Long
  Popup = Settings.getByIndex (PopupIndex)
  For i = 0 TO uBound (Popup)
    If Popup(i).Name = "ItemDescriptorContainer" Then
      getItemContainer = Popup(i).Value
      Exit Function
    End If
  Next i
End Function
огромное спасибо. взял за основу. элементы скрылись. но как бы еще отвязать горячие клавиши (не против отвязывать вообще все)? а то элементов меню и панели инструментов нет, но по горячим клавишам они вызываются. как вариант в окне настроек можно сохранить конфиг горячих клавиш. но как его программно загрузить?

sokol92

Посмотрите, пожалуйта, на это решение от @librebel и напишите о своих впечатлениях.

ВНИМАНИЕ! Не забудьте закоментировать строки вида
oShortCutManager.store()если не требуется, чтобы изменения стали постоянными.
Владимир.

proger1983

Цитата: sokol92 от  5 декабря 2023, 15:05Посмотрите, пожалуйта, на это решение от @librebel и напишите о своих впечатлениях.

ВНИМАНИЕ! Не забудьте закоментировать строки вида
oShortCutManager.store()если не требуется, чтобы изменения стали постоянными.
и еще раз огромное спасибо. решение отличное, учитывая общий исходный объект с предыдущим решением для элементов меню и панелей (ModuleUIConfigurationManagerSupplier), но есть одно но. некоторые сочетания клавиш назначены не на отдельные приложения (Writer, Calc, Impress), а на весь LibreOffice/OpenOffice (например, Ctrl + S, Ctrl + P...). горячие клавиши на отдельные приложения отвязываются, а на весь LibreOffice/OpenOffice - нет. смотрел и в сторону getUIConfigurationManager, где параметр: "ModuleIdentifier - a module identifier which identifies an OpenOffice.org module. The module identifier can be retrieved from the com::sun::star::frame::ModuleManager service". взяв у com::sun::star::frame::ModuleManager список идентификаторов через ElementNames (в нем были идентификаторы для Writer, Calc, Impress), отвязать горячие клавиши уровня LibreOffice/OpenOffice так пока и не вышло (пробовал весь этот список).

sokol92

Джером К. Джером: Трое на четырех колесах.:
ЦитироватьНемцы, у которых каждое слово в каждой фразе зависит по меньшей мере от четырех различных  правил, уверяют, что у англичан грамматики вовсе нет. В сущности, она есть; только  ее, к сожалению, признают не все англичане и этим поддерживают мнение иностранцев. Последних  еще  затрудняет, кроме зубодробительного произношения, наше правописание: оно действительно изобретено,  кажется, для того,  чтобы осаживать самоуверенность иностранцев, а то они изучали бы английский язык в один год.

По принципу английского языка сделан и LibreOffice - за один год не изучишь.  :)

За горячие клавиши приложения отвечает объект GlobalAcceleratorConfiguration.

Чтобы не думать, где глобальная горячая клавиша, а где модуля, можно для удаления горячей клавиши вызывать сразу две процедуры (в обозначениях цитированного выше сообщения):
Sub RemoveCommandShortcut( strCommandURL as String )
  Dim oShortCutManager As Object
  oShortCutManager = getShortCutManager()
  On Error GoTo ErrLabel
  oShortCutManager.removeCommandFromAllKeyEvents( strCommandURL )
ErrLabel:
End Sub

Sub RemoveGlobalCommandShortcut( strCommandURL as String )
  Dim oGlobalShortCutManager As Object
  oGlobalShortCutManager=CreateUnoService("com.sun.star.ui.GlobalAcceleratorConfiguration")
  On Error GoTo ErrLabel
  oGlobalShortCutManager.removeCommandFromAllKeyEvents( strCommandURL )
ErrLabel:
End Sub
Владимир.

proger1983

Цитата: sokol92 от  6 декабря 2023, 14:04Джером К. Джером: Трое на четырех колесах.:
ЦитироватьНемцы, у которых каждое слово в каждой фразе зависит по меньшей мере от четырех различных  правил, уверяют, что у англичан грамматики вовсе нет. В сущности, она есть; только  ее, к сожалению, признают не все англичане и этим поддерживают мнение иностранцев. Последних  еще  затрудняет, кроме зубодробительного произношения, наше правописание: оно действительно изобретено,  кажется, для того,  чтобы осаживать самоуверенность иностранцев, а то они изучали бы английский язык в один год.

По принципу английского языка сделан и LibreOffice - за один год не изучишь.  :)

За горячие клавиши приложения отвечает объект GlobalAcceleratorConfiguration.

Чтобы не думать, где глобальная горячая клавиша, а где модуля, можно для удаления горячей клавиши вызывать сразу две процедуры (в обозначениях цитированного выше сообщения):
Sub RemoveCommandShortcut( strCommandURL as String )
  Dim oShortCutManager As Object
  oShortCutManager = getShortCutManager()
  On Error GoTo ErrLabel
  oShortCutManager.removeCommandFromAllKeyEvents( strCommandURL )
ErrLabel:
End Sub

Sub RemoveGlobalCommandShortcut( strCommandURL as String )
  Dim oGlobalShortCutManager As Object
  oGlobalShortCutManager=CreateUnoService("com.sun.star.ui.GlobalAcceleratorConfiguration")
  On Error GoTo ErrLabel
  oGlobalShortCutManager.removeCommandFromAllKeyEvents( strCommandURL )
ErrLabel:
End Sub

и снова огромнейшее спасибо. теперь все отлично отвязывается и скрывается. до идеала не хватает возможности влезть в левую панель стартового окна (на рисунке, где "Open...", "Create..."; туда добавить своих элементов, скрыть стандартные).

sokol92

Этого "монстра" (панель слева) я не выучил, так как не использую стартовый центр - сразу открываю scalc.
Меню сверху можно получить, указав параметр "com.sun.star.frame.StartModule".
Владимир.