前の関連記事: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の例と全く同じマクロコードを生成するために何回やり直したことやら、、、
記録したマクロを実行する
ツール→マクロ→マクロを実行、でマクロセレクターを開きます。
「ライブラリ」から、マイマクロ→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 subThe 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の配列(シークエンス)ですが、具体的な項目についての解説は文書化されていないようです。
(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。
0 件のコメント:
コメントを投稿