A. Basic

OpenOffice.org Basic は組み込まれたマクロ用の言語です。コンポーネントを実装することはできませんがリスナーは独自の方法で利用可能です。OOo Basic と短く呼ばれることもあります。

言語の詳細については下記などを参照してください。

OpenOffice.org BASIC Programming Guide
http://wiki.services.openoffice.org/wiki/Documentation/BASIC_Guide
OpenOffice.org Basic
http://ja.wikibooks.org/wiki/OpenOffice.org_Basic
OpenOffice.org Basic ヘルプ
組込み

OOo Basic ではメソッド名の大文字と小文字を区別することなく記述できますが、他の言語へ移植するときのことなどを考えると IDL の定義どおりのメソッド名で書いたほうがいいでしょう。

マクロを書く

OOo Basic でマクロを書くにはメニューからツール - マクロ - マクロの管理 - OpenOffice.org Basic を選択します。この管理ダイアログからマクロのライブラリやモジュールの管理が行えます。モジュールを選択して編集ボタンを押すと Basic IDE が開いてコードを編集できます。

UNO の値

他の言語で書くよりも各種ランタイム関数がショートカットなどを提供しています。

css.uno.XComponentContext

必要になることは滅多にありませんが次のようなランタイム関数が用意されています。

ctx = GetDefaultContext()
サービスのインスタンス

便利なランタイム関数が用意されています。XComponentContext などが不要ですが乱用すると別の言語へ移植するときに複雑化することがあります。

sfa = CreateUnoService("com.sun.star.ucb.SimpleFileAccess")

css.lang.XMultiComponentFactory からサービスをインスタンス化する必要があるときには次のようにします。

smgr = GetDefaultServiceManager()
oObj = smgr.createInstanceWithArguments("service_name", Array(oObj))

Desktop にアクセスするランタイム関数も用意されています。この関数名は実際に StarDesktop があった頃の名残です。

desktop = StarDesktop()
Structs

二種類の方法があります。

aSize = CreateUnoStructs("com.sun.star.awt.Size")

もう一つの方法では struct の配列も簡単に作成できます。

Dim aPoint As New com.sun.star.awt.Point
' 配列では
Dim aPoints(2) As New com.sun.star.awt.Point
Enums

次のようにモジュール名から順に値までを指定します。文字列にしてはいけません。

oText.FontSlant = com.sun.star.awt.FontSlant.ITALIC
Constants

Enum と同様に値を指定します。

oText.FontWeight = com.sun.star.awt.FontWeight.BOLD
例外

例外はエラーとしてキャッチすることはできますが送出することができません。

Sub main
  On Error GoTo Handler:
  ' なにかが例外を発生
  Handler:
    msgbox Error
End Sub

例外処理やエラーコードについては OpenOffice.org のヘルプを参照してください。

リスナー

OOo Basic ではクラスを作成できないためインターフェースが必要なリスナーを作ることができないため、特別なランタイム関数 CreateUnoListener が用意されています。関数の最初の引数には "_" で終わる接頭語を指定、二つ目の引数には作成するリスナーのインターフェースを指定します。接頭語は次のように利用されます。

Sub AddListener()
  DialogLibraries.loadLibrary("Standard")
  dlg = CreateUnoDialog(DialogLibraries.Standard.Dialog1)
  
  oListener = CreateUnoListener("Mouse_", "com.sun.star.awt.XMouseListener")
  dlg.addMouseListener(oListener)
  dlg.execute()
  dlg.removeMouseListener(oListener)
  dlg.dispose()
End Sub

Sub Mouse_mousePressed(oEv As com.sun.star.awt.MouseEvent)
  msgbox "Count: " & CStr(oEv.ClickCount)
End Sub
Sub Mouse_mouseReleased(oEv As com.sun.star.awt.MouseEvent)
End Sub
Sub Mouse_mouseEntered(oEv As com.sun.star.awt.MouseEvent)
End Sub
Sub Mouse_mouseExited(oEv As com.sun.star.awt.MouseEvent)
End Sub
Sub Mouse_disposing(oEv As com.sun.star.lang.EventObject)
End Sub

css.awt.XMouseListener インターフェースには四つのメソッドがありますがこれらを接頭語 + メソッド名を組み合わせた名前のプロシージャまたは関数を定義しておきます。必要のないメソッドも内容は空で構わないので定義しておかなければいけません。
disposing メソッドは XMouseListener インターフェースにはありませんがリスナーのベースインターフェースである css.lang.XEventListener のメソッドです。このメソッドはいつも定義するようにして下さい。

色々

よく必要になる色々なこと。

URL - FilePath 変換

ファイルパスから URL。

sURL = ConvertToURL("/home/user/Desktop/Test.ods")

URL からファイルパス。

sPath = ConvertFromURL("file:///home/user/Desktop/Test.ods")
ライブラリ

OOo Basic のライブラリには二種類あります。アプリケーションに所属するものとドキュメントに所属するものです。ライブラリへはショートカットとして BasicLibraries ステートメントが用意されています。このステートメントは特に指定がなければそのコードが所属しているライブラリコンテナを示します。

BasicLibraries.Library1

このコードがドキュメントにあるときにはドキュメントに所属しているライブラリが指定され、コードがアプリケーションにあるときにはアプリケーションに所属しているライブラリが指定されることになります。

一方でドキュメントにあるコードからアプリケーションにあるライブラリが必要なときには GlobalScope キーワードを利用します。

Globalscope.BasicLibraries.Library1

利用したいライブラリが読み込まれていなければ次のようにして読み込む必要があります。

Globalscope.BasicLibraries.loadLibrary("Tools")

モジュール単位での読み込みはできずライブラリ単位になります。

Standard の名前のライブラリは特殊でアプリケーションが起動したときまたはドキュメントが読み込まれたときにロードされています。

ダイアログ

ダイアログライブラリにも二種類ありライブラリと同様にアプリケーションとドキュメントに所属しています。DialogLibrareis ステートメントを利用する以外はライブラリと同様です。

DialogLibrareis.Library1
GlobalScope.DialogLibrareis.Library1 ' いつもアプリケーションのライブラリ

ダイアログを作成するランタイム関数 CreateUnoDialog が用意されています。利用したいダイアログが所属するライブラリを先に読み込んでおく必要があります。

Sub createDialog()
  DialogLibrareis.loadLibrary("Library1")
  oDialog = CreateUnoDialog(DialogLibrareis.Library1.Dialog1)

  oDialog.execute()
End Sub

ダイアログライブラリの Standard ライブラリは自動的に読み込まれるわけではないので利用する前に読み込まなければいけません。

Calc 関数

Calc のシート上で利用できる関数を簡単に定義できます。しかし、この関数には問題点があります。シート関数は Standard ライブラリに入っている必要がありますがこのライブラリは拡張機能などから配布することはできません。そのため人に配布しにくいという難点があります。また、実行速度が遅いので注意する必要があります。

Function Increment(v)
  Increment = v + 1
End Function

=INCREMENT(A1) といったようにセルのアドレスで指定された場合にはセルの内容の種類に応じて値が渡されます。セルオブジェクトが渡されるわけではないので、この関数内ではどのセルから呼び出されたかどうかは判断できません。位置を特定できる引数を与える必要があります。

制限

いくつか知られている制限があります。

IDE へのコピーペースト

IDE の編集画面に 64k を超える文字数をペーストしようとすると超えた文字分だけ切れるようです。

ファイル容量

一つのモジュールは 64k 文字数以下にすることが推奨されています。複数のモジュールに分割してください。

予約語

ヘルプファイルなどに特に予約後などについて書かれていませんが全てのステートメントと全てのランタイム関数は再定義できません。

バグ

多数のバグがあるので注意が必要です。バージョンに依存します。