LibreOffice(33)デベロッパーガイド5:ディスパッチフレームワーク

ラベル:

前の関連記事:LibreOffice(32)デベロッパーガイド4:コンポーネントフレームワーク


フレームワークAPIのコンポーネントフレームワークではない方、ディスパッチフレームワークについて勉強します。「マクロの記録」を使って実際にコマンドURLをみてみます。
(2017.11.5追記。ディスパッチコマンド一覧を取得するマクロを作成しました。LibreOffice5(92)全ディスパッチコマンドのラベルの取得参照。)

ユーザーインターフェイスからのコマンドを処理するのがディスパッチフレームワーク


コンポーネントフレームワークでは、目的のオブジェクトがどれであるのかを調べて、そのオブジェクトをコンポーネントコンテクストからたどって得て、APIリファレンスでそのオブジェクトが備えているインターフェイスを調べて、そのメソッドを実行して目的を達成する必要がありました。

それに対してディスパッチフレームワークはコマンドURLといわれるコマンドを対象となるフレームに送信する(ディスパッチする)だけで処理が実行されます。(6.1.6 ディスパッチ・フレームワークの利用 Using the Dispatch Framework)

このディスパッチフレームワークはメニューやマウスの操作などユーザーインターフェイスのからの操作の処理に使わます。

ディスパッチフレームワークにより、ドキュメントがWriterであろうとClacであろうとそれらのインターフェイスの違いを知ることなく、同じようなメニューの選択でそれぞれのドキュメントにあった処理ができます。

メニューを選択するとそのドキュメントのフレームに対してコマンドURLが発せられます(ディスパッチする。)


フレームとコントローラはcom.sun.star.frame.XDispatchProviderインターフェイスを備えており、フレームにディスパッチされたコマンドURLは適切なコンポーネントに届けられます。(ディスパッチ・フレームワーク Dispatch Framework)

コマンドURLを知るには「マクロの記録」を使う必要がある


コマンドURL一覧を探してみましたがLibreOfficeのものは見つけられず、Framework/Article/OpenOffice.org 2.x Commandsしかありませんでした。

この一覧もオプション引数の記載のない不完全なものです。

(2014.4.13追記。デベロッパーガイドには「コマンドURLsをもつテーブルは付録にある」(Getting a Dispatch Object)と書いてあり付録 - ユニバーサル・コンテンツ・プロバイダ Appendix C: Universal Content Providersがそれに該当するようです。)

コマンドURLを引数も含めて知るには「マクロの記録」を使わないといけません。

マクロの記録が使用できるのはWriterとCalcのみです。

LibreOffice4.2.2.1ではマクロの記録は「実験的(不安定)なオプション」になっています。

LibreOfficeのいずれかのアプリから、メニュー→ツール→オプション、LibreOffice→詳細。


「マクロの記録を有効にする(限定的)」をチェックして「OK」します。

これでマクロの記録が使えるようになります。

Writerでマクロの記録を使う


The OpenOffice.org recorder and UNO dispatch callsにOpenOffice.org Writerでのマクロの記録の例があります。

これと同じマクロコードを生成する操作をLibreOffice Writerのマクロの記録でやってみます。


表示→ツールバー→書式設定、にチェックがついているのを確認しておきます。

ツール→マクロ→マクロの記録、を選択するとマクロの記録が開始されます。

①「例文」と入力。

②エンターキーで改行。

③「新しい段落に」と入力。

④書式設定ツールバーの「太字」ボタンをクリック。


⑤「太字の」と入力。

⑥書式設定ツールバーの「太字」ボタンをクリックして、太字設定を解除する。

⑦「単語を含める」と入力。

「記録の終了」をクリックするとマクロの保存ダイアログがでてきます。


右下の「新規モジュール」をクリックして新しいモジュールを作成します。

ここでは「マクロの保存先」のマイマクロ→Standard→Module2、が作成されました。

「マクロの名前」には「Main」が入ります。

好きな名前に変えることもできますが、全角文字は「名前が無効です。」といわれて使えませんでした。


マクロの名前が「Main」の場合、上書きをするのか問われるので、「はい」を選択。

これでマクロの記録が完了です。

マクロの記録では全ての操作が記録されるので全く同じマクロコードを再現しようと思うと上記の①から⑦を全くその通りに実行しないといけません。

The OpenOffice.org recorder and UNO dispatch callsに書いてあるように、メニューから、書式→文字、フォント→アジア諸言語用のフォント→スタイル→「太字」に変更→「OK」、という操作ではフォントの設定のコマンドが入ってしまうのでツールバーから太字を設定する方法にしました。

書式設定ツールバーの太字ボタンをクリックしても太字設定が解除されない時があり、そのときはWriterを再起動して、再度入力すれば解除されるようになりました。

The OpenOffice.org recorder and UNO dispatch callsの例と全く同じマクロコードを生成するために何回やり直したことやら、、、

記録したマクロを実行する


Writerで、ファイル→新規作成→文書ドキュメント、で新しい文書ドキュメントを作成しそこで先ほど記録したマクロを実行してみます。

ツール→マクロ→マクロを実行、でマクロセレクターを開きます。


「ライブラリ」から、マイマクロ→Standard→Module2、を選択すると「マクロ名」に「Main」というマクロがでてくるので右上の「実行」ボタンをクリックします。


例文
新しい段落に太字の単語を含める

これがちゃんと再現されましたね。

記録されたマクロを見る


マクロの記録はLibreOffice Basicでされます。

ツール→マクロ→マクロの管理→LibreOffice Basic。

「マクロの記録先」から、マイマクロ→Standard→Module2、を選択して「編集」ボタンをクリックします。


記録されたマクロは以下になります。
REM  *****  BASIC  *****


sub Main
rem ----------------------------------------------------------------------
rem define variables
dim document   as object
dim dispatcher as object
rem ----------------------------------------------------------------------
rem get access to the document
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

rem ----------------------------------------------------------------------
dim args1(0) as new com.sun.star.beans.PropertyValue
args1(0).Name = "Text"
args1(0).Value = "例文"

dispatcher.executeDispatch(document, ".uno:InsertText", "", 0, args1())

rem ----------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:InsertPara", "", 0, Array())

rem ----------------------------------------------------------------------
dim args3(0) as new com.sun.star.beans.PropertyValue
args3(0).Name = "Text"
args3(0).Value = "新しい段落に"

dispatcher.executeDispatch(document, ".uno:InsertText", "", 0, args3())

rem ----------------------------------------------------------------------
dim args4(0) as new com.sun.star.beans.PropertyValue
args4(0).Name = "Bold"
args4(0).Value = true

dispatcher.executeDispatch(document, ".uno:Bold", "", 0, args4())

rem ----------------------------------------------------------------------
dim args5(0) as new com.sun.star.beans.PropertyValue
args5(0).Name = "Text"
args5(0).Value = "太字の"

dispatcher.executeDispatch(document, ".uno:InsertText", "", 0, args5())

rem ----------------------------------------------------------------------
dim args6(0) as new com.sun.star.beans.PropertyValue
args6(0).Name = "Bold"
args6(0).Value = false

dispatcher.executeDispatch(document, ".uno:Bold", "", 0, args6())

rem ----------------------------------------------------------------------
dim args7(0) as new com.sun.star.beans.PropertyValue
args7(0).Name = "Text"
args7(0).Value = "単語を含める"

dispatcher.executeDispatch(document, ".uno:InsertText", "", 0, args7())


end sub
The OpenOffice.org recorder and UNO dispatch callsの例と同じコードができましたね。

11行目でまずコマンドURLの送り先となるフレームを取得して"document"という変数に代入しています。
dispatcher.executeDispatch(document, ".uno:InsertText", "", 0, args1())
このようにdispatcher.executeDispatchで始まる行にコマンドURLが書いてあります。

OOoBasic/Generic/dispatch - ...?com.sun.star.frame.XDispatchHelperに解説があります。

dispatcher.executeDispatch(オブジェクト名, ".uno:コマンド名", "フレーム名", 検索フラグ, オプション引数)

オブジェクト名にはcom.sun.star.frame.XDispatchProviderインターフェイスを備えているオブジェクトを指定します。

ということはフレーム以外にcom.sun.star.frame.XDispatchProviderインターフェイスを備えているコントローラからもコマンドURLを直接送れるようです。(フレームとコントローラ

フレーム名と検索フラグ(FrameSearchFlag)についてはターゲット・フレーム Target Frameに解説があります。

フレーム名は空欄""は"_self"と同じで現在のフレームを返します。

検索フラグについてはcom/sun/star/frame/FrameSearchFlag.idlに解説がありますが、「0」というのは「設定しない」、と同義のようです。

オプション引数はcom.sun.star.beans.PropertyValueのStructの配列(シークエンス)ですが、具体的な項目についての解説は文書化されていないようです。

ということでコマンドURLについてはこのマクロの記録を使って調べるしかなさそうです
(2017.8.21追記。ディスパッチコマンド一覧をみつけました。
Development/DispatchCommands - The Document Foundation Wiki
Resource ID Valueは既に廃止されているslotidに該当しているようです。)

参考にしたサイト


Apache OpenOffice Developer's Guide - Apache OpenOffice Wiki
PDF版の表紙にOpenOffice.org 3.1 Developer's Guideと書いてあります。

Developer's Guide
OpenOffice Developer's Guideの日本語版。OpenOffice.org 2.0より前のもののようです。

Framework/Article/OpenOffice.org 2.x Commands - Apache OpenOffice Wiki
OpenOffice.org 2.xでのコマンドURL一覧。

The OpenOffice.org recorder and UNO dispatch calls - Apache OpenOffice Wiki
OpenOffice..orgでの「マクロの記録」の例。

OOoBasic/Generic/dispatch - ...?
ディスパッチフレームワークをマクロから利用する方法。

LibreOffice: Namespace List
LibreOffice 4.2 SDK APIの入り口com.sun.star。

次の関連記事:LibreOffice(34)Basicマクロのモジュールやライブラリーは改名不能?

PR

0 件のコメント:

コメントを投稿