LibreOffice5(153)プロトコルを使う状況を考える

2018-04-29

旧ブログ

t f B! P L
LibreOffice5(152)プロトコルハンドラとジョブにでてきた各プロトコルについて使用する状況を考えます。

前の関連記事:LibreOffice5(152)プロトコルハンドラとジョブ


vnd.sun.star.script:*を使う状況


マクロからマクロを呼び出す場合

このプロトコルを使う一例はマクロから他のマクロを呼び出す場合です(OOoBasic/Generic/invokeScript - ...?)。

LibreOffice(40)埋め込みマクロ2:値の引渡しと受け取りでは、ScriptingURLからXScriptインターフェイスをもつオブジェクトを取得して、そのinvoke()メソッドで埋め込みマクロを呼び出して実行しています。

このinvoke()メソッドでマクロを呼び出すときに引数を渡せます。

ScriptingURLで呼び出されるマクロをマクロセレクターから呼び出すときは引数を受け取れないので、そのマクロは引数があってもなくてもエラーがでないようにしておかないといけません。

Addons.xcuで作成した新規のメニュー項目のコマンドURLとして使う場合

もう一つの例はAddons.xcu(LibreOffice5(19)イベント駆動する拡張機能のJavaの例:AsyncJob.oxt その3)で作成した新規のメニュー項目のコマンドURLとしてScriptingURLを指定して、メニューからマクロを実行できるようにする場合です。

ScriptingURLだけでは引数をマクロに渡せないので、Addons.xcuで作成したメニューでは引数は渡せません。

そもそもAddons.xcuでメニューを追加するためには拡張機能を作成しないといけない上に、さらに呼び出すマクロも用意しないといけないので、新規メニュー項目のコマンドURLとしてvnd.sun.star.script:プロトコルを使う機会はそうないように思います。

カスタマイズしたコンテクストメニュー項目のコマンドURLとして使う場合

コンテクストメニューのカスタマイズにはXContextMenuInterceptorインターフェイスをもつオブジェクトをコントローラに渡します(Calc(28)コンテクストメニューをカスタマイズする: その1)。

Addons.xcuで作成したメニュー項目と同様にScriptingURLをコマンドURLとして使います。

引数は渡せませんが、ScriptingURLで指定したファイルのグローバル変数として、マクロにオブジェクトを渡すことはできます。

vnd.sun.star.job:*を使う状況


このプロトコルを使うためにはまずJobs.xcuでジョブを定義しないといけません。

onlineupdate.xcdにはUpdateCheckというジョブが定義されています。
<oor:component-data oor:name="Jobs" oor:package="org.openoffice.Office">
 <node oor:name="Jobs">
  <node oor:name="UpdateCheck" oor:op="replace">
   <prop oor:name="Service">
    <value>com.sun.star.setup.UpdateCheck</value>
   </prop>
   <node oor:name="Arguments">
    <prop oor:name="AutoCheckEnabled" oor:type="xs:boolean" oor:op="replace">
     <value>true</value>
    </prop>
    <prop oor:name="LastCheck" oor:type="xs:long" oor:op="replace">
     <value>0</value>
    </prop>
    <prop oor:name="CheckInterval" oor:type="xs:long" oor:op="replace">
     <value>604800</value>
    </prop>
    <prop oor:name="DownloadDestination" oor:type="xs:string" oor:op="replace">
     <value />
    </prop>
    <prop oor:name="AutoDownloadEnabled" oor:type="xs:boolean" oor:op="replace">
     <value>false</value>
    </prop>
    <prop oor:name="DownloadSupported" oor:type="xs:boolean" oor:op="replace">
     <value>true</value>
    </prop>
    <prop oor:name="DownloadPaused" oor:type="xs:boolean" oor:op="replace">
     <value>false</value>
    </prop>
    <prop oor:name="ExtendedUserAgent" oor:type="xs:boolean" oor:op="replace">
     <value>false</value>
    </prop>
   </node>
  </node>
 </node>
 <node oor:name="Events">
  <node oor:name="onFirstVisibleTask" oor:op="fuse">
   <node oor:name="JobList">
    <node oor:name="UpdateCheck" oor:op="replace" />
   </node>
  </node>
 </node>
</oor:component-data>
onFirstVisibleTaskというイベントが発生するとジョブUpdateCheckが発火します。

LibreOffice起動時にアップデートがあるか確認するためのものです。

impress.xcdにはorg.libreoffice.PresenterScreenというジョブが定義されています。
<oor:component-data oor:name="Jobs" oor:package="org.openoffice.Office">
 <node oor:name="Jobs">
  <node oor:name="org.libreoffice.PresenterScreen" oor:op="replace">
   <prop oor:name="Service">
    <value>org.libreoffice.comp.PresenterScreenJob</value>
   </prop>
   <prop oor:name="Context">
    <value>com.sun.star.presentation.PresentationDocument</value>
   </prop>
  </node>
 </node>
 <node oor:name="Events">
  <node oor:name="onDocumentOpened" oor:op="fuse">
   <node oor:name="JobList">
    <node oor:name="org.libreoffice.PresenterScreen" oor:op="replace" />
   </node>
  </node>
 </node>
</oor:component-data>
onDocumentOpenedイベントが発生するとジョブorg.libreoffice.PresenterScreenが発火するように定義されています。

ジョブを定義すると発生したイベントに連動してマクロを実行したり、LibreOffice5(16)イベント駆動する拡張機能のJavaの例:AsyncJob.oxt その1のようにインストール後に1回だけ実行するマクロ、などが作成できます。

しかしそういう必要性がなければわざわざジョブを定義するのは面倒です。

プロトコルハンドラを実装する状況


ProtocolHandler.xcuでプロトコルを定義してプロトコルハンドラをUNOコンポーネントで実装するとディスパッチコマンドのように使えるプロトコルを作成できます。

作成したプロトコルハンドラではURL StructのArgumentsアトリビュートでコマンドURLで引数を受け取るようにできそうです(未確認)。

しかしプロトコルハンドラの作成にはXDispatchProviderXDispatchXInitializationインターフェイスの実装が必要なので少し面倒です(ProtocolHandlerAddonPython/ProtocolHandlerAddon.py OOoPython/ComplexToolbar - ...?)。

service:*を使う状況


XJobExecutorインターフェイスのtrigger()メソッドを実装するだけで済むので、メニュー項目に使うコマンドURLを作成するには、プロトコルハンドラを作成するよりもこの方法を使う方が手間が少なくて済みます。

参考にしたサイト


OOoBasic/Generic/invokeScript - ...?
マクロからマクロの呼び出し方。

次の関連記事:LibreOffice5(154)数値フィールドコントロールのサービスとインターフェイスの一覧

ブログ検索 by Blogger

Translate

最近のコメント

Created by Calendar Gadget

QooQ