LibreOffice5(25)MRI - UNO Object Inspection Tool:その1

ラベル: ,

前の関連記事:LibreOffice5(24)unoinsp.py:出力を抑制するインターフェイスの指定方法を追加


LibreOffice(44)UNOオブジェクトの属性3:Writerドキュメントに出力のコメントでもお勧めされたインスペクタのMRIを使ってみます。linuxBean14.04(83)LibreOfiice5.0.2のインストールでやったlinuxBean14.04のLibreOffice5.0.2.2にインストールします。

MRIのダウンロードとインストール


MRI - UNO Object Inspection Tool | Apache OpenOffice Extensionsの右にある「Download extension」をクリック。

MRI-1.3.1.oxtファイルがダウンロードされました。

LibreOfficeを起動してツール→拡張機能マネージャー。

「追加」ボタンをクリック。

MRI-1.3.1.oxtファイルを選択。


ライセンス条項を確認したら「許可」。


LibreOfficeを再起動してインストール完了です。

ツール→アドオン→MRI、で開いているドキュメントをインスペクトする



ツール→アドオン→MRI。

この方法ではXDesktopインターフェイスのgetCurrentComponent()で得られたオブジェクトに対してインスペクトした結果が表示されます。

MRI<-selectionの場合はgetCurrentComponent().getCurrentSelection()で得られたオブジェクトに対してインスペクトした結果になります。

Writerのドキュメントを開いた状態でツール→アドオン→MRI、とやってみます。


これはXSCRIPTCONTEXT.getDocument()で得られたWriterドキュメントに対してインスペクトした結果になります。

それぞれのタブにはこのオブジェクトがもっているすべてのプロパティ、メソッド、インターフェイス、サービスが一覧にされています。

Toolsメニューの設定


まずToolsメニューからMRIに関する設定を行います。

Abbreviatedのチェックをはずすと型情報の表示でcom.sun.starが省略されず表示されます。

Pseud Properyにチェックをつけていると、getやsetから始まるメソッドで取得や設定できる値もプロパティとして表示してくれます。

例えばgetArgs()メソッドがあるとPropertiesタブにArgsというPseudプロパティが表示されます。

MethodsタブのgetArgs()メソッドは表示されたままです。

このチェックは外して使うことにしました。

ただ、これはチェックを外しても次回起動するとチェックが入ってしまいますの毎回外さないといけません。

Show Labelsのチェックをはずすと各タブの先頭行の項目名の表示が省略されます。


Codeという項目がありこれのCodeにチェックが入っているとウィンドウの下の枠に選択した言語のコードが表示されます。

うーん。なにのコードを表示しているのかよくわかりません。

これもチェックは外すことにしました。

Tools→Configurationの設定



OpenOffice.org SDK Directoryのhttp://api.openoffice.org/をhttp://api.libreoffice.org/に書き換えるとLibreOfficeのAPIリファレンスに繋がるかと期待しましたがダメでした。

IDL reference is generated by Doxygenにチェックつけてもダメでした。

ブラウザはlinuxBean14.04(99)Chromeに代わってChromiumのインストールのChromiumに変更しました。

それ以外はデフォルトのままです。

サービスタブ


Services_ja · hanya/MRI Wiki · GitHub


サービスタブにはSupported Service NamesとAvailable Service Namesが出力されています。

Supported Service NamesはオブジェクトがサポートしているXServiceInfoサービスのでgetSupportedServiceNames()得られたものです。

Available Service NamesはXMultiServiceFactoryインターフェイスのgetAvailableServiceNames()メソッド、XMultiComponentFactoryインターフェイスのgetAvailableServiceNames()メソッド、XContentEnumerationAccessインターフェイスのgetAvailableServiceNames()メソッドから得られたものです。

LibreOffice5(24)unoinsp.py:出力を抑制するインターフェイスの指定方法を追加のunoinsp.pyでみるとWriterドキュメントはXMultiServiceFactoryインターフェイスしかもっていませんので、Available Service Namesで得られたサービス名はcreateInstance()メソッドかcreateInstanceWithArguments()メソッドでインスタンス化できることになります。

試しにやってみるとcom.sun.star.form.component.DateFieldをcreateInstance()でインスタンス化できました。

コンポーネントコンテクストを渡してコンクストの伝播をするXMultiComponentFactoryではなくXMultiServiceFactoryを使っているのはコンポーネントコンテクストを渡すまでもなくコンテクストが自明だからでしょうか。

ざっとAvailable Service Names一覧をみたところドキュメントと強く関係するものばかりに見えます。

ちょっといまのところ私にはこれ以上の使い方はわかりませんがそのうち出てくるでしょう。

インターフェイスタブ


Interfaces_ja · hanya/MRI Wiki · GitHub

インターフェイスタブにはInterfacesとListenersの項があります。

これは単に「Listener」という名前で分類されているように思えます。

メソッドダブ


Methods_ja · hanya/MRI Wiki · GitHub


1行にメソッド名、引数、戻り値の型、所属するインーターフェイス名、例外名の順に出力されています。


メソッドの行をダブルクリックすると引数を入力するダイアログがでてきます。

文字列型はそのまま入力できますがそれ以外の型の場合は参照ボタンをクリックするとHistoryダイアログができます。


Historyの項目はここでは入力できませんでした。


Macro→bundle.py→Add css.uno.XComponentContext to the history、で現在開いているオブジェクトの型をHistoryに追加することができました。


メソッドに引数に入れたいのはインターフェイス名ではなくインスタンスなのですが、それの入れ方はいまのところわかりません。

「IDL Ref.」や「Ref.」ボタンをクリックするとウェブブラウザが起動しOpenOfficeのIDLリファレンスのページが開きます。

プロパティタブ


Properties_ja · hanya/MRI Wiki · GitHub


1行にプロパティ名、型、値、Info、Attr.、Handleの順に出力されています。

Tools→Pseud Propertyにチェックをつけているとgetやsetから始まるメソッドで取得や設定できる値もプロパティとしてその行にはInfo.にPseudと表示されます。

Attr.はどこから判断しているのかいまのところはわかりません。

Handleが何を表しているのかわかりません。

参考にしたサイト


MRI - UNO Object Inspection Tool | Apache OpenOffice Extensions
MRIのダウンロードサイト。

Home_ja · hanya/MRI Wiki · GitHub
MRIの使い方。

次の関連記事:LibreOffice5(26)MRI - UNO Object Inspection Tool:その2

PR

4 件のコメント:

  1. MRI の機能について
    - Tools メニューのON/OFFで切り替えられるメニューの状態を保存するには、Tools - Configuration の Save state of "Tools" options. にチェックを入れて OK を押します。
    - Code にチェックを入れておくと、メソッドの呼び出しプロパティの取得、設定を順にコードに入れていきます。インターフェースをクエリする必要のある Java や C++ で便利です。フォーラムなどでの簡単な質問にたいして全部この生成されたコードで回答する人もいます。
    - ドキュメントインスタンスで取得できる Available Service Names はドキュメントに関連したものばかりになります。これはそのドキュメントを構成する要素のサービスのインスタンスをインスタンス化するためのものだからです。
    - History: 履歴からメソッドなどに渡す値を選択します。そのため、最初のオブジェクトでは履歴は空です。
    - プロパティの Handle は、内部でプロパティの値を配列に保持するときに使用する配列のインデックスです。com.sun.star.beans.XFastPropertySet インターフェースのメソッドでこのハンドルを利用して高速なプロパティアクセスが可能ですが、このインターフェースを実装しているサービスは数多くありません。また、ハンドル値は実装依存なので、バージョンごとに異なる可能性があります。ハンドル値は自分で作成したサービスのプロパティがおかしくないかどうかなどのデバッグ用と考えてください。
    - Attr.: 属性かどうかはインスペクトした後、com.sun.star.beans.PropertyConcept.ATTRIBUTES を指定してプロパティが存在するかどうかを com.sun.star.beans.XIntrospectionAccess::hasProperty メソッドで判定します。

    返信削除
    返信
    1. ご指摘ありがとうございます。
      うまく使いこなしたいと思います。
      まだ理解できないことがたくさんあるので頑張りたいと思います。

      削除
  2. LibreOffice 5.0.2.2 linuxBean14.04 MRI 1.3.1
    この条件でやってみましたがやはりToolsメニューのPseud Propertyのチェックを外した状態は保存されませんでした。
    Tools→Code→Pseud Propertyの状態は保存されています。
    ~/.config/libreoffice/4/user/registrymodifications.xcuをみると/mytools.Mri.Configuration/SettingsにUsePseudPropertyやAbbreviatedの項目はあるのですがUsePseudPropertyはTools→Code→Pseud Propertyの状態を保存しておりTools→Pseud Propertyを保存している項目は見つけられませんでした。
    mytools_Mri/ui/frame.pyの98行目をみるとTools→Pseud Propertyはt_pseud、Tools→Code→Pseud Propertyはt_pseudpropertyに対応していました。
    t_pseudは107行目でconfig.property_onlyに否定(チェックを外すとTrue)で状態が保持されていました。
    ConfigurationのSave states of "Tools" options.のチェックをつけるとsave_optionsがTrueになるのでそれでコードをたどっていくとmytools_Mri/config.pyの128行目でregistrymodifications.xcuに設定を保存しているのですが、そこにproperty_onlyがみあたりません。
    mytools_Mri/values.pyのConfigNames自体にproperty_onlyに該当しそうな項目がありません。
    values.pyとconfig.py、config.xcs、config.xcuにproperty_onlyの項目を追加したところregistrymodifications.xcuに状態が保存されるようになりましたが、よく考えたらデフォルトの状態はxcsファイルに保存されていないのでregistrymodifications.xcuの状態は反映されないと気がつきました。
    やってみると案の定その通りでした。
    デフォルトの状態はどこで設定しているかまで探すところまではいきつきませんでした。

    ConfigurationのSave states of "Tools" options.のチェック自体が保存されていない状態とも、思ったのですがこれはmytools_Mri/config.pyの134行目で毎回Falseにリセットされており、Toolsの項目を保存しようとするときは毎回チェックをつけないといけないことはわかりました。

    返信削除
  3. 結局あれこれいじってTools→Pseud Propertyの状態の保存ができるようになりました。
    mytools_Mri/__init__.pyにわざわざself.config.property_only = Falseと毎回チェックをつけるようになっているので作者の意図には反しているのかもしれません。

    返信削除