Calc: Как скрыть сетку активного листа без диспетчера?

Автор eeigor, 11 апреля 2021, 11:12

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

eeigor

Какой метод дублирует .uno:ToggleSheetGrid? Как узнать, отображаются ли линии сетки в данный момент?
Sub ToggleSheetGrid
Dim document As Object, dispatcher As Object

document = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
dispatcher.executeDispatch(document, ".uno:ToggleSheetGrid", "", 0, Array())
End Sub


ThisComponent.CurrentController.ShowGrid = False  'скрывает сетку на всех листах (?)

Updated
Это выглядит устрашающе (ссылка)... 2011. Прошло 10 лет.
Кстати, в функции от @sokol92 (файл прикреплён), которая выводит на лист все методы диспетчера с параметрами, этого метода (ToggleSheetGrid) почему-то нет...

В этом есть какая-то непоследовательность...
Напр., этот метод затрагивает все листы:
>>> ThisComponent.CurrentController.ShowGrid = True
А этот только активный лист:
>>> ThisComponent.CurrentController.freezeAtPosition(0, 1)
А объект один и то же! Баг, что ли?.. Неужели для такой задачки нужно отдельное расширение?
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

sokol92

В формате .ods в файле settings.xml тег с именем (атрибутом имени) "Showgrid" формируется для каждого листа отдельно. Соответствующее свойство контроллера документа тоже, по идее, должно работать с активным листом, а меняет отображение сетки сразу всех листов. Я склонен рассматривать это как баг.

Что касается упомянутого файла DispCommands.ods, то в него включены только "слоты методов" (method slots) в соответствии с описанием разработчика. "Слоты свойств" (property slots) не включались, так как мне неизвесты критерии для их отбора. Команда ToggleSheetGrid относится к слоту свойств.
Владимир.

eeigor

Похоже, баг с 10-летним стажем. Файл settings.xml посмотрел. Может, напишу позднее...
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

eeigor

Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

eeigor

#4
Баг или не баг?
Цитата: sokol92 от 11 апреля 2021, 14:21В формате .ods в файле settings.xml тег с именем (атрибутом имени) "Showgrid" формируется для каждого листа отдельно.

Меню "View/View Grid Lines" управляет не той сеткой, что на скриншотах ниже (или той, но отдельным образом). А ниже - это ThisComponent.CurrentController.ShowGrid.
В чём разница? Выходит, что баг был не по теме. Однако одинаковое название свойств "ShowGrid" сбивает с толку. И как в коде заменить команду диспетчера ".uno:ToggleSheetGrid", которое соответствует команде меню, а не свойству приложения, что выбирано на скриншоте 2 (и отображено на скриншоте 1, позиция 11)?

А вот и разница с путаницей в именах: ToggleSheetGrid и ShowGrid. И в файле settings.xml тоже ShowGrid, однако, но не то (а то, что управляется командой uno:ToggleSheetGrid).

Примечание. Команда меню и команда диспетчера управляют активным листом. Похожее свойство приложения управляет всеми листами и содержит дополнительный параметр "Show on colored cells", помимо Show/Hide.

Updated
Свойство приложения в файле конфигурации registrymodifications.xcu именуется GridLine и, похоже, оно задаётся в коде так: ThisComponent.CurrentController.ShowGrid. Могу ошибаться.
<.../Layout/Line"><prop oor:name="GridLine" oor:op="fuse"><value>true</value></prop></item>

<.../Layout/Line"><prop oor:name="GridOnColoredCells" oor:op="fuse"><value>false</value></prop></item>

Подытожим:
1. Команда меню <View/View Grid Lines> и диспетчера .uno:ToggleSheetGrid управляют свойством активного листа, а результат записывается в параметр ShowGrid в settings.xml электронной таблицы (в файл).
2. ThisComponent.CurrentController.ShowGrid и свойство приложения <View/Grid lines> управляют параметром GridLine в файле конфигурации registrymodifications.xcu и распространяются на все листы электронной таблицы. Так ли это?

Как получить ответ на вопрос, отображается ли сетка заданного листа в данный момент, не ясно... Я не знаю, как обратиться к вложенному файлу settings.xml
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

sokol92

Цитата: eeigor от  5 июня 2021, 13:53Как получить ответ на вопрос, отображается ли сетка заданного листа в данный момент, не ясно...
В моих записях тоже стоит вопросительный знак.
Владимир.

eeigor

Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

sokol92

20 лет месяцев спустя.  :)
Поскольку в меню (Menu / View / View Grid Lines) видно, установлен ли для листа признак показа сетки, то можно попробовать спросить у меню (надеюсь, без тяжелой артиллерии в виде AccessibleContext). У меня такие универсальные сервисные функции не написаны, потребуется некоторое время (если нет готовых решений).
Владимир.

eeigor

Готовых нет. А с этим контекстом разбирались только Вы один: я так до конца его и не понял.
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

sokol92

Благодаря сообщению Михаила, можно предложить такой подход (см. макрос TestFeature).
Option Explicit

Dim oFeatureStateEvent As Object

' ----------------------------------------------------------------------------------
' lang:en
' Return FeatureStateEvent structure or Nothing.
' - obj   Object supporting XModel or XDispatchProvider interfaces.
' - sUrl  describe the feature which should be supported by returned dispatch object.
'         For uno commands prefix ".uno:" may be omitted.
'
' lang:ru
' Возвращает структуру FeatureStateEvent или Nothing.
' - obj   Объект, поддерживающий интерфейсы XModel или XDispatchProvider.
' - sUrl  Описывает функцию, которая должна поддерживаться возвращаемым объектом
'         диспетчеризации (например, Url команды .uno:).
'         Для uno-команды префикс ".uno:" можно не указывать.
Function GetFeatureState(Byval obj As Object, ByVal sUrl As String) As Object
  Dim oListener As Object, oDisp As Object, url As Object
 
  GetFeatureState=Nothing
 
  If Not HasUnoInterfaces(obj, "com.sun.star.frame.XDispatchProvider") Then
    If HasUnoInterfaces(obj, "com.sun.star.frame.XModel") Then
      obj=obj.CurrentController
    End If
    If Not HasUnoInterfaces(obj, "com.sun.star.frame.XDispatchProvider") Then Exit Function
  End If
 
  oFeatureStateEvent=Nothing
  If Instr(1, sUrl, ":")=0 Then sUrl=".uno:" & sUrl
  url=getURLObject(sUrl)
  oDisp=obj.queryDispatch(url, "_self", 0)
  If oDisp Is Nothing Then Exit Function
  oListener=CreateUnoListener("statusList_", "com.sun.star.frame.XStatusListener")
  oDisp.addStatusListener(oListener, url)
  oDisp.removeStatusListener(oListener, url)

  GetFeatureState=oFeatureStateEvent
End Function


' ----------------------------------------------------------------------------------
' lang:en
' Returns util.URL object.
'
' lang:ru
' Возвращает util.URL объект.
Function getURLObject(Byval urlString As String) As Object
  Dim url As New com.sun.star.util.URL
  url.Complete = urlString
  CreateUnoService("com.sun.star.util.URLTransformer").parseStrict(url)
  getURLObject = url
End Function


' ----------------------------------------------------------------------------------
' statusList_ Subs
Sub statusList_statusChanged(oEvent)
  oFeatureStateEvent=oEvent
End Sub 

Sub statusList_disposing(oEvent)
End Sub

' ----------------------------------------------------------------------------------
Sub TestFeature
  Dim oEvent As Object, unoCmd As String
  'unoCmd="ViewRowColumnHeaders"
  unoCmd="ToggleSheetGrid"
  oEvent=GetFeatureState(ThisComponent, unoCmd)
  If Not (oEvent Is Nothing) Then
    Msgbox unoCmd & " state: " & oEvent.State
  End If 
End Sub
Владимир.

Kadet

'***********************************************************************************
Sub ListCalc(Optional oDoc As Object, Optional oName$, Optional fixRow%, Optional bHeaders as Boolean, Optional bGrid as Boolean)
    dim document as object, oSheet as object, oCurrentController as object
ON LOCAL ERROR GOTO Error53:

    If IsMissing (oDoc) Then Exit Sub
    document = oDoc.CurrentController.Frame
    If NOT IsMissing (oName) Then oSheet = oDoc.getSheets().getByName(oName)
    oCurrentController = oDoc.getCurrentController()
    oCurrentController.select(oSheet)

    If NOT IsMissing (bHeaders) Then document.Controller.HasColumnRowHeaders = bHeaders    'Убрать названия сток и стоблцов
    If NOT IsMissing (bGrid) Then document.Controller.ShowGrid = bGrid   'Убрать разметку ячеек

    If NOT IsMissing (fixRow) Then
        Select Case fixRow
            Case 1
                oCurrentController.freezeAtPosition(0,1)    'Фиксировать 1 первые строки
            Case 2
                oCurrentController.freezeAtPosition(0,2)    'Фиксировать 2 первые строки
            Case 3
                oCurrentController.freezeAtPosition(0,3)    'Фиксировать 3 первые строки
            Case 4
                oCurrentController.freezeAtPosition(0,4)    'Фиксировать 4 первые строки
            Case 5
                oCurrentController.freezeAtPosition(1,1)    'Фиксировать 1 первую строки и 1 первый столбец
        End Select
    End If

Error53:
    ON LOCAL ERROR GOTO 0
End Sub



sokol92

Цитата: Kadet от  2 апреля 2024, 17:58If NOT IsMissing (bGrid) Then document.Controller.ShowGrid = bGrid  'Убрать разметку ячеек

О конструкции CurrentController.ShowGrid см. выше в этой теме.
Владимир.