A. Java-UNO

Java-UNO ブリッジは標準で組み込まれています。OOo 3.1 辺りからは JRE 1.4 が必要です。Java のマクロを書いてコンパイルするには JDK も必要です。

Java-UNO を利用するときに必要なクラスライブラリは以下のもので全て OOo に付属しています。環境により配置場所が少し異なります。

  • ooo-dev/basis3.2/program/classes/unoil.jar UNO IDL から作成されたクラス
  • ooo-dev/ure/share/java/juh.jar Java UNO Helper ブートストラップやコンポーネント実装用ヘルパー
  • ooo-dev/ure/share/java/jurt.jar コンポーネント登録ヘルパー、接続用クラス
  • ooo-dev/ure/share/java/ridl.jar IDL 定義から作成されたクラス

UNO IDL Reference と同じように Java 用の UNO Reference も必要です (SDK に含まれています)。

Java UNO Reference
http://api.openoffice.org/docs/java/ref/overview-summary.html

UNO の値

Java - UNO 間での値の変換はUNO Type Mappingsを参照してください。

css.uno.XComponentContext

マクロではマクロ用の static 関数の最初の引数として渡される css.script.provider.XScriptContext インターフェースの getComponentContext メソッドからアクセスします。

import com.sun.star.uno.XComponentContext;
import com.sun.star.script.provider.XScriptContext;

  public static void print(XScriptContext xScriptContext) {
       XComponenetContext xContext = xScriptContext.getComponentContext();
  }

オートメーション関連。

サービスのインスタンス
import com.sun.star.lang.XMultiComponentFactory;
import com.sun.star.frame.XComponentLoader;
import com.sun.star.uno.UnoRuntime;

XMultiComponentFactory xmcf = xContext.getServiceManager();
Object desktop = xmcf.createInstanceWithContext(
    "com.sun.star.frame.Desktop", xContext);
XComponentLoader xloader = UnoRuntime.queryInterface(XComponentLoader.class, desktop);
インターフェースのクエリ

インターフェースをクエリするときには css.uno.UnoRutime クラスの queryInterface メソッドを利用します。

ridl.jar をライブラリに入れておく必要があります。また、unoil.jar には IDL で定義されているインターフェースのクラス定義が含まれているのでこれも必要です。

Structs
import com.sun.star.beans.PropertyValue;

PropertyValue p = new PropertyValue();
p.Name = "FilterName"

IDL 由来の struct の場合には引数の無いコンストラクタ以外に IDL に定義されているフィールド順に引数をとるコンストラクタが定義されています。コンストラクタの定義を確認してください。

Enums

クラスのフィールドとして利用できますが各フィールドもクラスです。

import com.sun.star.awt.FontSlant;

xPropset.setPropertyValue("CharPosture", FontSlant.ITALIC);
Constants

各定数はクラスのフィールドとして定義されています。

import com.sun.star.awt.FontWeight;
FontWeight.BOLD;
例外

クラスとして定義されています。

throws com.sun.star.container.NoSuchElementException();

例外は引数なしのコンストラクタ、エラーメッセージ一つをとるもの、エラーメッセージおよび例外を発生したコンポーネントインスタンスを引数にとる三つのコンストラクタを持っています。

リスナー

リスナーとして必要なインターフェースを実装したクラスを利用します。

Any

Java では値の型が重要になるので Any に関する問題があります。メソッドの返り値などが any 型のときには css.uno.AnyConverter を利用して正しい値の型に変換します。

import com.sun.star.uno.AnyConvertor;
String sTxt = AnyConvertor.toString(obj);

また、any 型の値がインターフェースのときには値を変換せずにインターフェースを直接クエリしてかまいません。

css.uno.AnyConverter を利用するには jurt.jar をライブラリに入れておく必要があります。

マクロ

ツール - マクロ - マクロの管理以下のメニューに Java の項目はみられません。これは Javaコンパイルが必要な言語のために管理方法を提供していないためです。管理はできませんがマクロは実行できます。Java で書かれたマクロを実行するには、ツール - マクロ - マクロの実行から該当するマクロを選択します。

ファイルの配置

Java で書かれたマクロは user/Scripts/java 以下に配置します。このとき Java のクラスを jar ファイルにまとめて入れておき、同じディレクトリ内の parcel-descriptor.xml ファイルに情報を指定します。

マクロファイル

例えば次のようなクラスを作成して static 関数を定義します。ScriptProviderForJava はクラスをインスタンス化せずに呼び出せるこの関数を実行できます。

package org.scripts;
import com.sun.star.script.provider.XScriptContext;
import com.sun.star.text.XText;
import com.sun.star.text.XTextDocument;
import com.sun.star.text.XTextRange;
import com.sun.star.uno.UnoRuntime;

public class HelloWorld {

  public static void print(XScriptContext xScriptContext) {
    XTextDocument xTextDocument = UnoRuntime.queryInterface(
        XTextDocument.class, xScriptContext.getDocument());
    XText xText = xTextDocument.getText();
    XTextRange xTextRange = xText.getEnd();
    xTExtRange.setString("HelloWorld.");
  }

  public static void main(String[] args) {
  }
}

コンパイルしたファイルを jar ファイルにまとめておきます。

parcel-descriptor.xml

以下に簡単な例を示します。

<?xml version="1.0" encoding="UTF-8"?>
<parcel language="Java" xmlns:parcel="scripting.dtd">
    <script language="Java">
        <locale lang="en">
            <displayname value="HelloWorld.Java"/>
            <description>
                Prints "Helo World". 
            </description>
        </locale>
        <functionname value="org.scripts.HelloWorld.print"/>
        <logicalname value="HelloWorld"/>
        <languagedepprops>
            <prop name="classpath" value="HelloWorld.jar"/>
        </languagedepprops>
    </script>
</parcel>

parcel 要素は language 属性を持ちここでは使用する言語 Java を指定しています。さらに script 要素の language 属性でも同じように Java を指定します。

locale では lang 要素で表示の言語を指定します。ここでは en を利用していますが ja などでマルチバイト文字列を含む場合にはファイルを UTF-8 文字コードで保存しておきます。displayname はマクロの実行ダイアログで表示される名称、description にはマクロの実行ダイアログの説明に表示される内容を記述します。displayname は不具合なのかどうなのか実際には表示されているところを見かけることはありません。

functionname にはマクロの管理ダイアログで表示されるマクロ名を指定します。
logicalname には実行する関数をクラス.関数名の形で指定します。クラスがパッケージにある場合にはパッケージ名を含めて記述します。

languagedepprops の prop 要素には classpath として実行する関数をもつクラスを入れた jar ファイルを指定します。ここから実行する関数が検索されます。

マクロの実行ダイアログ上ではライブラリ名にはファイルを配置したディレクトリ名が使用されます。

マクロのリモートデバッグ

マクロをデバッグするにはリモートデバッグを使います。メニューからツール - オプション、OpenOffice.org - Java から利用している JRE を選択します。引数ボタンを押して次のようなパラメータを追加します。

-Xrunjdwp:transport=dt_socket,server=y,address=12999,suspend=n

ソケットにポート 12999 から接続できるように指定しています。
IDE などのデバッガから接続してデバッグします。

問題は OOoJava を起動させるタイミングです。メニューからマクロを実行してデバッグする場合には、マクロの実行ダイアログを開くと Java VM が起動します。そのときにデバッガを接続します。

標準出力が参照できる環境では JVM が起動すると次のような出力があります。

Listening for transport dt_socket at address: 12999