2017年4月22日土曜日

9: 最初のUNO拡張機能(LibreOffice拡張機能またはApache OpenOffice拡張機能)をビルドする、パート3

<このシリーズの、前の記事 | このシリーズの目次 | このシリーズの、次の記事>

>>
Main body START

いくつかの設定を環境に合わせる

-Hypothesizer

1つのAntビルドファイルまたは1つのGradleビルドスクリプト内の1つか2つのパラメーターを変更しなければならないかもしれない。Antのファイル、'commonBuild.properties'、Gradleのファイル、'commonBuild01.gradle'で、2つのパラメーター、'LIBREOFFICE_DIRECTORY_NAME'と'LIBREOFFICE_SDK_DIRECTORY_NAME'が、我々の環境と合っていなければ、変更する必要がある。

-Rebutter

ははあ。

-Hypothesizer

'LIBREOFFICE_DIRECTORY_NAME'は、LibreOfficeがインストールされたディレクトリ、'LIBREOFFICE_SDK_DIRECTORY_NAME'は、LibreOffice SDKがインストールされたディレクトリだ。Windows上では、これらは変更しなければならないだろう。これらを変更する時、ディレクトリの区切り文字は、'\'ではなく、'/'を使用する。このシリーズのWindows環境では、LibreOfficeを'D:\LibreOffice'にインストールしたので、'LIBREOFFICE_DIRECTORY_NAME'を'D:/LibreOffice'という値にセットし、LibreOffice SDKを'D:\LibreOffice\sdk'にインストールしたので、'LIBREOFFICE_SDK_DIRECTORY_NAME'は変更しなかった。

-Rebutter

分かった。

-Hypothesizer

このシリーズにおけるものと同じバージョンのLibreOfficeおよびLibreOffice SDKでは、他のパラメータは変更しなくてよいはずだが、もっと古いバージョンでは、他のパラメータを変更しなければならない可能性が高い。事実、LibreOffice 4では、ディレクトリ構造がLibreOffice 5のものと異なっていた。'commonBuild.properties'または'commonBuild01.gradle'内のプロパティ群、'LIBREOFFICE_*'に設定されたディレクトリやファイルが存在するか確認すればよい。

-Rebutter

ははあ。

最初のUNO拡張機能をビルドして登録する

-Hypothesizer

これで、'ant'コマンドまたは'gradle'コマンドを実行することができる。以下のようにする。ターミナルを開く−>カレントディレクトリを'unoUtilitiesToDisclose'ディレクトリに変更する−>Antを使うかGradleを使うかに応じて、'ant'または'gradle'を実行する。Antの場合もGradleの場合も、'BUILD SUCCESSFUL'というメッセージが表示されるはずだ。

-Rebutter

そのメッセージが表示されなかったらどうする?

-Hypothesizer

環境が、意図通りになっていないはずだ。JDKは8以降でなければならないし、上記の設定は正しく行なわれなければならないし、ディレクトリ名にはスペースが含まれないと想定されている。. . .

-Rebutter

オーケー。

-Hypothesizer

次に、以下のようにする。カレントディレクトリを'hiUnoExtensionsUnoExtension'に変更する−>Antを使うかGradleを使うかに応じて、'ant'または'gradle'を実行する。UNO拡張機能が正常にビルドされたら、コマンドは次に、UNO拡張機能をLibreOfficeに登録しようとする。LibreOfficeが既に起動されていれば、コマンドはLibreOfficeを終了しようとする。Linux上でwmctrlがインストールされていない場合、LibreOfficeを手動で終了しなければならない。Linux上でwmctrlがインストールされている場合、またはWindows上では、LibreOfficeは、未保存のファイルが開いていなければ自動で終了するだろう。未保存のファイルが開いていれば、それらのファイルを保存するように問われるだろう。LibreOfficeが何らかの理由で終了しない場合、LibreOfficeを手動で終了させなければならない。その後、LibreOfficeが自動で起動するだろう。処理が正常だったことは、Antの場合もGradleの場合も、'unopkg done.'と'BUILD SUCCESSFUL'のメッセージを見ることで確認できる。

-Rebutter

処理が成功しなかったらどうする?

-Hypothesizer

うーん、上に挙げた可能性もあるが、もし、LibreOfficeを終了させるスクリプトがうまく動かないのであれば(AntビルドファイルとGradleビルドスクリプトにbashやOSのコマンドが使われているので、Linuxディストリビューション間で何らかの非互換性があるかもしれない)、それは致命的ではない。UNO拡張機能はLibreOfficeのメニュー、'Tools(ツール)'-'Extension Manager...(拡張機能マネージャー...)'、から登録できる。UNO拡張機能ファイルは、サンプルUNO拡張機能プロジェクトディレクトリの下の'target'ディレクトリ内に存在するはずで、ファイル拡張子'oxt'のファイルがそれだ。ただ、UNO拡張機能を登録した後、LibreOfficeを再起動しなければならないことに注意しよう。

-Rebutter

分かった。

最初のUNO拡張機能をテストする

-Hypothesizer

登録されたサンプルUNO拡張機能をテストしよう。LibreOfficeマクロで、UNOサービスのインスタンスを作成し、そのUNOサービスインスタンスのメソッドを呼び出す。

-Rebutter

復習すると、サンプルUNO拡張機能には、一つのUNOインターフェースインプリメンテーションが含まれていて、これがUNOサービスとして登録されているのだったな?

-Hypothesizer

そうだ。実のところ、UNOインターフェースインプリメンテーションには、一つのstringパラメータを持つ'sayHi'という名前のメソッドがあって、UNOサービスは、'thebiasplanet.uno.hiunoextensionsunoextension.HiUnoExtensions'という名前で、一つのstringパラメータを持つcreate1という名前のUNOサービスコンストラクタを持っている。

-Rebutter

ははあ。

-Hypothesizer

以下のようにする。LibreOfficeのメニューで(どんなファイル(Writer文書、Calc文書、その他)が開いていてもよいし、どのファイルも開いていなくてもよい)'Tools(ツール)'をクリックする−>'Macros(マクロ)'−'Organize Macros(マクロの管理)'−'LibreOffice Basic...'をクリックする−>左にある'Macro From(マクロの記録先)'部の'My Macros(マイマクロ)'−'Standard'をクリックする−>'Macro Name(マクロ名)'部に'testsUnoExtension'(シングルクォーテーションは入力しなくてよい)または任意の有効な名前を入力する−>'New(新規作成)'ボタンをクリックする−>以下のコードを先ほど指定した名前のSub(そういうSubが作成されているはず)の中に入力する。

 Dim l_hiUnoExtensions As Variant
 l_hiUnoExtensions = thebiasplanet.uno.hiunoextensionsunoextension.HiUnoExtensions.create1 ("Hi")
 Msgbox (l_hiUnoExtensions.sayHi ("bro"))
-Rebutter

うーむ、Objectではなく、Variantを使うのか?

-Hypothesizer

参考文書 のページ下部にそうするように書いてある。このケースでは、Object使っても問題が起きないが、UNOオブジェクトは、厳密には、LibreOffice Basicオブジェクトではないらしい。

-Rebutter

ふーむ、とすると、LibreOffice Basicオブジェクトというのは何なのだ?

-Hypothesizer

分からない。UNOオブジェクトに適合する明示的なデータタイプはないらしい。また、妙なことには、上記参考文書ではLibreOffice Basicオブジェクトを使わないように推奨しているが、いくつかの参考文書(例えば、ここ)のサンプルコードでは、LibreOffice Basicオブジェクトが使われている。

-Rebutter

ふーむ。 . . .

-Hypothesizer

ところで、我々がUNOオブジェクトという用語を使う時、これは、UNOインターフェースインプリメンテーションインスタンスという用語と完全に互換だ。

-Rebutter

分かった。

-Hypothesizer

とにかく、このマクロを実行しよう。以下のようにする。このSubの内側にカーソルを置く−>F5キーを押す−>'Hi, bro!'というメッセージのメッセージボックスがポップアップするはずだ。

-Rebutter

このUNOオブジェクトは何をしているのか?

-Hypothesizer

コンストラクタから、ベースとなるメッセージを受け取り、'sayHi'というメソッドから、メッセージの受け手の呼び名を受け取り、組み立てられたメッセージを返しているだけだ。パラメータを変えれば、返されるメッセージが変わるののが分かるはずだ。

-Rebutter

ははあ。

-Hypothesizer

. . . 面白くないって?まあ、いわゆるHello World型のサンプルはたいていそんなものだろう。しかし、LibreOfficeからJavaのメソッドが呼び出せることが確かめられたので、こうしたメソッドにコードを組み込めば、LibreOfficeからほとんど何でも呼び出せることになる。ここで呼び出されているメソッドは、実際には、'HiUnoExtensionsImplementation.java'の'sayHi'というメソッドだ。

-Rebutter

分かった。

Main body END

References

  • Apache OpenOffice Wiki. (2014/01/02). Apache OpenOffice Developer's Guide. Retrieved from https://wiki.openoffice.org/wiki/Documentation/DevGuide/OpenOffice.org_Developers_Guide

<このシリーズの、前の記事 | このシリーズの目次 | このシリーズの、次の記事>