LibreOffice5(92)全ディスパッチコマンドのラベルの取得

2017-11-05

旧ブログ

t f B! P L
「全て」と言っても/opt/libreoffice5.2/share/registry/res/registry_ja.xcdに載っているディスパッチコマンドのみです。

前の関連記事:LibreOffice5(91)コンポーネントデータノードをルートまでたどる


ディスパッチコマンドのラベルが定義されているコンポーネントデータノード一覧


registry_ja.xcdファイルをChromiumで開いて整形されるのを待ってから「.uno:」で検索すると2211個ヒットが見つかります。

「node oor:name=".uno:」で検索してみても2211個がヒットしました。

これらについて網羅的にラベルの取得をしようと思ったのですが、ルートノードのパスを網羅的に取得する方法がわかりませんでした。

なので、「.uno:」で検索しつつルートノードのパスを手動でリストアップしました。
<oor:component-data oor:name="ReportCommands" oor:package="org.openoffice.Office.UI">
<oor:component-data xmlns:install="http://openoffice.org/2004/installation" oor:name="CalcCommands" oor:package="org.openoffice.Office.UI">
<oor:component-data xmlns:install="http://openoffice.org/2004/installation" oor:name="MathCommands" oor:package="org.openoffice.Office.UI">
<oor:component-data xmlns:install="http://openoffice.org/2004/installation" oor:name="GenericCommands" oor:package="org.openoffice.Office.UI">
<oor:component-data xmlns:install="http://openoffice.org/2004/installation" oor:name="DrawImpressCommands" oor:package="org.openoffice.Office.UI">
<oor:component-data xmlns:install="http://openoffice.org/2004/installation" oor:name="StartModuleCommands" oor:package="org.openoffice.Office.UI">
<oor:component-data xmlns:install="http://openoffice.org/2004/installation" oor:name="ChartCommands" oor:package="org.openoffice.Office.UI">
<oor:component-data xmlns:install="http://openoffice.org/2004/installation" oor:name="BasicIDECommands" oor:package="org.openoffice.Office.UI">
<oor:component-data xmlns:install="http://openoffice.org/2004/installation" oor:name="DbuCommands" oor:package="org.openoffice.Office.UI">
<oor:component-data xmlns:install="http://openoffice.org/2004/installation" oor:name="BibliographyCommands" oor:package="org.openoffice.Office.UI">
<oor:component-data xmlns:install="http://openoffice.org/2004/installation" oor:name="WriterCommands" oor:package="org.openoffice.Office.UI">
とりあえず11個見つけました。

パッケージ名はすべてoor:package="org.openoffice.Office.UI"になっています。

コンポーネント名このリストのものを使います。

全ディスパッチコマンドのラベルを取得するマクロ

#!/opt/libreoffice5.4/program/python
# -*- coding: utf-8 -*-
import unohelper  # オートメーションには必須(必須なのはuno)。
from com.sun.star.uno import RuntimeException
from com.sun.star.beans import PropertyValue
from com.sun.star.sheet import CellFlags as cf # 定数
def macro(documentevent=None):  # 引数はイベント駆動用。
 doc = XSCRIPTCONTEXT.getDocument() if documentevent is None else documentevent.Source  # ドキュメントのモデルを取得。 
 ctx = XSCRIPTCONTEXT.getComponentContext()  # コンポーネントコンテクストの取得。
 smgr = ctx.getServiceManager()  # サービスマネージャーの取得。
 configreader = createConfigReader(ctx, smgr)  # 読み込み専用の関数を取得。 
 props = "Label", "ContextLabel", "PopupLabel"  # 取得するプロパティのタプル。
 compornents = "ReportCommands", "CalcCommands", "MathCommands", "GenericCommands", "DrawImpressCommands", \
     "StartModuleCommands", "ChartCommands", "BasicIDECommands", "DbuCommands", "BibliographyCommands", "WriterCommands"
 subnodes = "Commands", "Popups"
 datarows = []  # 行のリストのリスト。タプルでも良いが、すべての要素のリストの要素数は一致させる必要がある。
 setIndicator, endIndicator = createStatusIndicator(doc)
 c = 0  # カウンター。
 setIndicator(c)
 for compornent in compornents:
  for subnode in subnodes:
   rootpath = "/org.openoffice.Office.UI.{}/UserInterface/{}".format(compornent, subnode)
   root = None
   try:
    root = configreader(rootpath) 
   except RuntimeException:
    continue
   if root is not None:
    outputs = []
    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)
    if outputs:
     c += len(outputs)  # カウンターを増やす。
     setIndicator(c)
     outputs.sort(key=lambda r: r[0])  # ディスパッチコマンドでソートする。
     outputs.append([""]*(len(props)+1))  # 最後に空行を入れる。
     datarow = ["DispatchCommand"]  # 先頭行のセルのリスト。
     datarow.extend(props)  # propsを先頭行に追加。
     rootpathrow = [rootpath]
     rootpathrow.extend([""]*len(props))
     datarows.extend((rootpathrow, datarow))  # 行のセルのリストのリスト。   
     datarows.extend(outputs)
 endIndicator()
 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)  # セルカーサーのセル範囲の列幅を最適化する。
 sheet[0, 1].setString("Got {} Labels".format(c))
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
def createStatusIndicator(doc):  # プログレスバーの表示。
 frame = doc.getCurrentController().getFrame()  # ドキュメントのフレームを取得。  
 indicator = frame.createStatusIndicator()  # フレームからステータスバーを取得する。
 maxrange = 2254  # ステータスバーに表示するプログレスバーの目盛りの最大値。
 indicator.start("Collecting labels for dispatch commands.", maxrange)  # ステータスバーに表示する文字列とプログレスバーの目盛りを設定。
 def setIndicator(c):
  indicator.setValue(c)  # プレグレスバーの位置を設定。
 def endIndicator():
  indicator.end()  # reset()の前にend()しておかないと元に戻らない。
  indicator.reset()
 return setIndicator, endIndicator
g_exportedScripts = macro, #マクロセレクターに限定表示させる関数をタプルで指定。 
ちょっと時間がかかるためステータスバーにプログレスバーを表示させるようにしました。

GetAllDispatchCommadLabels.ods

このマクロを埋め込んだCalcドキュメントです。

文書を開くとこのマクロが起動するようになっています。

https://docs.google.com/spreadsheets/d/e/2PACX-1vRxC0Ut-qE3mj3hHhOQ7vCF57FP06Epls-QEsgndSiAGPHse3V2HDsDVRqFbnL31UokRepb1cvZ3uqG/pubhtml?gid=591872511&single=true

linuxBeansでは2214個でてきました。

ディスパッチコマンドかどうかは確認していないので、2211個より少し増えています。

https://docs.google.com/spreadsheets/d/e/2PACX-1vRxC0Ut-qE3mj3hHhOQ7vCF57FP06Epls-QEsgndSiAGPHse3V2HDsDVRqFbnL31UokRepb1cvZ3uqG/pubhtml?gid=1167085010&single=true

Windows10では2204個でした。

次の関連記事:LibreOffice5(93)ファイルフィルターのダイアログ(UIComponent)の一覧を取得

ブログ検索 by Blogger

Translate

最近のコメント

Created by Calendar Gadget

QooQ