Calc(38)ディスパッチコマンドのラベル一覧の取得

2017-11-04

旧ブログ

t f B! P L
Calcでのディスパッチコマンドのユーザーインターフェイスでのラベルを調べます。

前の関連記事:Calc(37)コンテクストメニューをカスタマイズする: その6


ディスパッチコマンドのラベルには3種類ある


registry_ja.xcdファイルのコンポーネントデータノードにあるディスパッチコマンド.uno:FormatCellDialogのノードをみるとLabel、ContextLabel、PopupLabelの3つのpropノードがあって3種類のラベルがあることがわかります。
<node oor:name=".uno:FormatCellDialog">
    <prop oor:name="Label" oor:type="xs:string">
        <value xml:lang="ja">セルの書式設定(~C)...</value>
    </prop>
    <prop oor:name="ContextLabel" oor:type="xs:string">
        <value xml:lang="ja">セル(~L)...</value>
     </prop>
    <prop oor:name="PopupLabel" oor:type="xs:string">
        <value xml:lang="ja">セルの書式設定(~F)...</value>
    </prop>
</node>
.uno:FormatCellDialogはセルの書式設定ダイアログを表示するディスパッチコマンドです。

ラベルは3種類あるのですが、Calcでセルの書式設定ダイアログを表示させるのは、ツールバーの書式→セル、かセルを右クリック→セルの書式設定、の2パターンしかみつけられませんでした。

ラベルから推測すると、ツールバーの書式→セル、ではContextLabel、セルを右クリック→セルの書式設定ではLabelかPopupLabelが使われているのがわかります。
<node oor:name=".uno:InsertColumnsAfter">
    <prop oor:name="Label" oor:type="xs:string">
        <value xml:lang="ja">列を右に挿入(~L)</value>
    </prop>
    <prop oor:name="ContextLabel" oor:type="xs:string">
        <value xml:lang="ja">列の右(~R)</value>
    </prop>
    <prop oor:name="PopupLabel" oor:type="xs:string">
        <value xml:lang="ja">右に列を挿入(~R)</value>
    </prop>
</node>
.uno:InsertColumnsAfterはLabelとContextLabel、PopupLabelがすべて異なるラベルになっています。

ツールバーのシート→列の挿入→列の右、ではContextLabel、列ヘッダーを右クリック→右に列を挿入、ではPopupLabel、が使われていることがわかりましたが、Labelの「列を右に挿入」はどこにでてくるのかわかりませんでした。

これら2つのディスパッチコマンドについてしか調査していませんが、ツールバーから呼び出した時はContextLabel、コンテクストメニューから呼び出すとPopupLabelが使われるようです、、、名称からは逆のように感じますけど。

すべてのディスパッチコマンドに3種類のラベルがあるわけではなく、Labelしかないコマンドもたくさんあります。

/org.openoffice.Office.UI.CalcCommands/UserInterface/Commandsのラベルを網羅するマクロ

#!/opt/libreoffice5.4/program/python
# -*- coding: utf-8 -*-
import unohelper  # オートメーションには必須(必須なのはuno)。
from com.sun.star.beans import PropertyValue
from com.sun.star.sheet import CellFlags as cf # 定数
def macro(documentevent=None):  # 引数はイベント駆動用。
 rootpath = "/org.openoffice.Office.UI.CalcCommands/UserInterface/Commands"
 doc = XSCRIPTCONTEXT.getDocument() if documentevent is None else documentevent.Source  # ドキュメントのモデルを取得。 
 ctx = XSCRIPTCONTEXT.getComponentContext()  # コンポーネントコンテクストの取得。
 smgr = ctx.getServiceManager()  # サービスマネージャーの取得。
 configreader = createConfigReader(ctx, smgr)  # 読み込み専用の関数を取得。
 props = "Label", "ContextLabel", "PopupLabel"  # 取得するプロパティのタプル。
 outputs = []  # 行のセルのリスト。
 root = configreader(rootpath)  # org.openoffice.TypeDetectionパンケージのTypesコンポーネントのTypesノードを根ノードにする。
 for childname in root.getElementNames():  # 子ノードの名前のタプルを取得。ノードオブジェクトの直接取得はできない模様。
  node = root.getByName(childname)  # ノードオブジェクトを取得。
  propvalues = ["" if i is None else i for i in node.getPropertyValues(props)]  # 設定されていないプロパティはNoneが入るので""に置換する。
  datarow = [childname]
  datarow.extend(propvalues)
  outputs.append(datarow)
 outputs.sort(key=lambda r: r[0])  # ディスパッチコマンドでソートする。
 datarow = ["DispatchCommand"]  # 1行目のセルのリスト。
 datarow.extend(props)
 datarows = [datarow]  # 行のセルのリストのリスト。  
 datarows.extend(outputs)
 controller = doc.getCurrentController()  # コントローラーを取得。
 sheet = controller.getActiveSheet()  # アクティブなシートを取得。
 sheet.clearContents(cf.VALUE+cf.DATETIME+cf.STRING+cf.ANNOTATION+cf.FORMULA+cf.HARDATTR+cf.STYLES)  # セルの内容を削除。cf.HARDATTR+cf.STYLESでセル結合も解除。
 sheet[:len(datarows), :len(datarows[0])].setDataArray(datarows)  # シートに結果を出力する。
 cellcursor = sheet.createCursor()  # シート全体のセルカーサーを取得。
 cellcursor.gotoEndOfUsedArea(True)  # 使用範囲の右下のセルまでにセルカーサーのセル範囲を変更する。
 cellcursor.getColumns().setPropertyValue("OptimalWidth", True)  # セルカーサーのセル範囲の列幅を最適化する。
def createConfigReader(ctx, smgr):  # ConfigurationProviderサービスのインスタンスを受け取る高階関数。
 configurationprovider = smgr.createInstanceWithContext("com.sun.star.configuration.ConfigurationProvider", ctx)  # ConfigurationProviderの取得。
 def configReader(path):  # ConfigurationAccessサービスのインスタンスを返す関数。
  node = PropertyValue(Name="nodepath", Value=path)
  return configurationprovider.createInstanceWithArguments("com.sun.star.configuration.ConfigurationAccess", (node,))
 return configReader
g_exportedScripts = macro, #マクロセレクターに限定表示させる関数をタプルで指定。 
このマクロをCalcで実行するとディスパッチコマンドでソートしてシートにディスパッチコマンド一覧を出力します。

275個のディスパッチコマンドが出てきました。

ラベルの言語はLibreOfficeの言語設定に依存するので、ユーザーインターフェイスを英語に変更すると英語のラベルが取得できました。

/org.openoffice.Office.UI.CalcCommands/UserInterface/Commands

https://docs.google.com/spreadsheets/d/e/2PACX-1vQGr3jsKAJngAdA9vOxAe3hEQn3PAwwznT0D-1hW7RFloc9sSiBzfcVNbKbAzMCCY3wVzUJji2-wdX1/pubhtml?gid=428376659&single=true

Googleドキュメントに日本語の場合の一覧を載せましたが、.uno:Cutとか.uno:Copyは入っていませんね。

.uno:Cutのラベルがあるノードを調べる


LibreOffice5(91)コンポーネントデータノードをルートまでたどると同じ手順でラベルを探すことにします。

まず「Cut」でshare/registryにあるファイルの内容を検索してみるとmain.xcdとregistry_ja.xcdがでてきました。

main.xcdを.uno:Cutで検索するとたくさんでてくるので、registry_ja.xcdで検索します。
<node oor:name=".uno:Cut">
  <prop oor:name="Label" oor:type="xs:string">
    <value xml:lang="ja">切り取り(~C)</value>
  </prop>
</node>
このノードが2か所にでてきました。

xpath = './/node[@oor:name=".uno:Cut"]'

このXPathでregistry_ja.xcdを検索すると全く同じノードが二つでてきます。


このXPathでルートまでのノードを調べました。


registry_ja.xcdは日本語の設定をしているものなので、ノードについてはmain.xcdからたどっても同じ結果になります。

それぞれのルートノードに対してディスパッチコマンド一覧を出力しました。

/org.openoffice.Office.UI.GenericCommands/UserInterface/Commands

https://docs.google.com/spreadsheets/d/e/2PACX-1vQGr3jsKAJngAdA9vOxAe3hEQn3PAwwznT0D-1hW7RFloc9sSiBzfcVNbKbAzMCCY3wVzUJji2-wdX1/pubhtml?gid=1956986923&single=true

788個のディスパッチコマンドがでてきました。

/org.openoffice.Office.UI.StartModuleCommands/UserInterface/Commands

https://docs.google.com/spreadsheets/d/e/2PACX-1vQGr3jsKAJngAdA9vOxAe3hEQn3PAwwznT0D-1hW7RFloc9sSiBzfcVNbKbAzMCCY3wVzUJji2-wdX1/pubhtml?gid=586039503&single=true

これは19個のディスパッチコマンドしかでてきませんし、すべてLabelしか設定がありません。

これで終わりと思ったらまだCalcのディスパッチコマンドがありました。

/org.openoffice.Office.UI.CalcCommands/UserInterface/Popups

https://docs.google.com/spreadsheets/d/e/2PACX-1vQGr3jsKAJngAdA9vOxAe3hEQn3PAwwznT0D-1hW7RFloc9sSiBzfcVNbKbAzMCCY3wVzUJji2-wdX1/pubhtml?gid=946964966&single=true

これには51個載っています。

次の関連記事:Calc(39)コンテクストメニューをカスタマイズする: その7

ブログ検索 by Blogger

Translate

最近のコメント

Created by Calendar Gadget

QooQ