OpenOffice.org Basic速修講座:ユーザ設定の外部ファイルへの保存法

 OpenOffice.orgを基にしたソリューションの活用を考える場合、ユーザ設定を独自に別途保存する機能が使えると、柔軟かつ効率的でよりユーザフレンドリな使用法が可能となるはずだ。よって本稿では、ユーザ設定をプレインテキスト形式に書き出してそれを再取得する方法を解説する。

 OpenOffice.org BasicのShell関数を使用して外部アプリケーションを起動させる方法については、既に以前の速修講座で解説している。この方法を用いると、例えば下記のサンプルコードのように、指定したリンクをFirefox上で開くという操作がOpenOffice.org内部から直接行えるはずだ。

Shell ("firefox", 1, "http://www.wikipedia.org")

 ただしこのサンプルコードには無視し得ない欠点が存在する。それは、アプリケーションの実行可能ファイルに対するパスを直接記述する方式がマクロとしての柔軟性を損なっているというものだ。これを実感するには、このコードをWindowsに移植する際に必要となる、次のようなパス変更を考えてみればいいだろう。

Shell ("C:\Program Files\Mozilla Firefox\firefox.exe", 1, "http://www.wikipedia.org")

 このような処理に柔軟性を持たせる方法としては、次のようにGetGUIType関数を用いて、最初に実行プラットフォームをチェックしておくという対策が考えられる。

If GetGUIType=1 Then
  Shell ("C:\Program Files\Mozilla Firefox\firefox.exe", 1, "http://www.wikipedia.org")
Else
  Shell ("firefox", 1, "http://www.wikipedia.org")

 ただしこうしたマクロを自分以外のユーザと共有するケースまで考えを広げると、状況はより複雑化してしまうはずだ。そもそもユーザによっては、Firefoxをデフォルト以外の場所にインストールしている可能性もあるし、あるいはFirefoxではなくOperaやKonquerorだけを使っているかもしれない。そうした問題への対策の1つとしてまず思いつくのは、下記のサンプルコードのように、使用するブラウザのパス情報をユーザ自身に入力させるインプットボックスをマクロに記述しておくというものだろう。

BrowserPath=InputBox("Enter browser path", "Default browser")
Shell (BrowserPath, 1, "http://www.wikipedia.org")

 ただしこのような、実行するごとにパス情報をいちいちユーザが入力するという方式では、実用性を損ねてしまう。より優れたアプローチとしては、1度入力されたパス情報はユーザ設定ファイルに書き出しておき、必要時にマクロが読み込むという処理を設ければいいはずだ。

 しかしながらそうした機能を実装するとなると、パス情報をマクロ本文中に記述するのではなく、特定の場所に置かれたユーザ設定ファイルに書き出す方法を見つけなくてはならない。幸いなことにOpenOffice.org Basicには、そうした処理に利用可能なサービスが用意されている。現在のユーザ名とホームディレクトリに関する情報を格納する環境変数の$USERと$HOMEについては、既にご承知のことだろう。これらの環境変数に収められた値は様々なシェルスクリプトにて利用されているが、実はOpenOffice.orgにも同様な変数がいくつか用意されているのだ。例えばOpenOffice.orgのユーザ設定ディレクトリ(/home/user/.openoffice.org2/userなど)に対するパスを返す$(user)変数もそうした1つである。そして下記のようにcom.sun.star.util.PathSubstitutionサービスを用いると、$(user)変数を基にして、OpenOffice.orgにおける現在のユーザディレクトリに関する情報を取得できるのだ。

SubstService = CreateUnoService("com.sun.star.util.PathSubstitution")
UserPath = SubstService.substituteVariables("$(user)", true)

 これによりユーザ設定ファイルを保存するディレクトリに関する情報は取得できるので、次にファイル名の指定をしなくてはならないが、ここでは分かりやすいようにユーザ設定ファイルを格納する専用のサブディレクトリも設けるようにしておこう。

PrefFile = UserPath + "/prefs/defaultbrowser.ini"

 こうしてパスを特定したユーザ設定ファイルに書き込むブラウザのパス情報そのものについては、下記のように標準的なインプットボックスを用いて、ユーザ自身に入力してもらえばいい。

BrowserPath=InputBox("Enter browser path", "Default browser")

 最後のステップは、上記のコードにて取得したブラウザのパス情報を、先に設定したdefaultbrowser.iniというファイルに書き出すことだ。OpenOffice.org Basicを用いたファイルへのデータ書き出し手順については以前の記事で取り上げており、それに従うとここでは下記のようなコードブロックを使用すればいいはずである。

f1 = FreeFile()
  Open PrefFile for output as #f1
  Print #f1, BrowserPath
  Close #f1

 以上をまとめたマクロの全体は、下記のコードとなる。

Sub WriteBrowserPath

SubstService = CreateUnoService("com.sun.star.util.PathSubstitution")
UserPath = SubstService.substituteVariables("$(user)", true)
PrefFile = UserPath + "/prefs/defaultbrowser.ini"

BrowserPath=InputBox("Enter browser path", "Default browser")

f1 = FreeFile()
  Open PrefFile for output as #f1
  Print #f1, BrowserPath
  Close #f1

End Sub

ファイルからのデータの読み込み

 残された作業としては、先のユーザ設定ファイルを読み込んで、以前に書き出しておいたブラウザのパス情報を取り出すという、これまでと逆の操作を行うマクロを用意しなくてはならない。これができれば、後は再取得したブラウザのパス情報をShell()に渡して、指定されたブラウザを起動させるだけである。

 この場合も1番目のマクロと同様、最初に行うべき処理としてはユーザ設定ファイルの保存先に関するパス情報を取得しなくてはならないが、これを行うコード部については、新規の関数処理を書き起こすよりも1番目のマクロの該当部をそのまま流用する方が手間がかからないはずだ。

 その次に行うべき処理は、目的とするファイルの有無を確認し、それが存在する場合は当該ファイルを開いて、ブラウザのパス情報が記載されている第1行目を読み込むというものである。なおユーザ設定ファイルが存在しなかった場合の処理としては、下記のコードのように、先に完成させた1番目のマクロ(WriteBrowserPath)を呼び出すようにしておけばいいだろう。

If FileExists(PrefFile) Then
  f1 = FreeFile()
  Open PrefFile for Input as #f1
  Line Input #f1, BrowserPath
  Close #f1
Else
  WriteBrowserPath
End If

 以上、この2番目のマクロの全体をまとめたコードは下記のようになる。

Sub ReadBrowserPath

SubstService = CreateUnoService("com.sun.star.util.PathSubstitution")
UserPath = SubstService.substituteVariables("$(user)", true)
PrefFile = UserPath + "/prefs/defaultbrowser.ini"

If FileExists(PrefFile) Then
  f1 = FreeFile()
  Open PrefFile for Input as #f1
  Line Input #f1, BrowserPath
  Close #f1
Else
  WriteBrowserPath
End If

End Sub

 こうして完成した2つのマクロの内容は、特定のユーザ設定をテキストファイルに書き出し、それを再び読み込むというものだが、これらを応用するとマクロで行える作業の幅を格段に広げられるはずだ。例えばその具体的な応用例としては、OpenOffice.orgが現在開いているドキュメント群を記録しておき次回起動時にクリック1つでその状態を復元するという処理を実装したLast Session機能拡張が参考になるだろう。

Dmitri Popovは、フリーランスのライターとして、ロシア、イギリス、アメリカ、ドイツ、デンマークのコンピュータ雑誌に寄稿している。

Linux.com 原文(2008年9月16日)