UNO component packaging ja
Python UNO コンポーネント
このページでは作成済みの UNO コンポーネントのパッケージ化および配布方法を説明します。非常に簡単な例として私が作成した Wavelet クラスを使用します。
より詳細が必要なら [Developers Guide] を参照してください。
Python ローダー
Python ローダーは自身があるパスにないクラスを読み込むことができません。そのため、使用する全てのクラスおよびモジュールを OpenOffice.org Python ライブラリのディレクトリにコピーしなければいけません。さらに、実行前に OOo を再起動する必要があるかもしれません。 訳注: OOo 2.4 以降ではユーザー独自の Python モジュールをインポートする方法が実装されています。
Python コンポーネント例
Wavelet クラス
私が作成した Wavelet クラスを使用します。このクラスはチェコ語の前置詞の前のスペースを改行されないスペースで置換します。次のコードを Wavelet.py ファイルに保存してください。
import uno
import unohelper
from com.sun.star.task import XJobExecutor
class Wavelet( unohelper.Base, XJobExecutor ):
def __init__( self, ctx ):
self.ctx = ctx
def trigger( self, args ):
desktop = self.ctx.ServiceManager.createInstanceWithContext(
"com.sun.star.frame.Desktop", self.ctx )
doc = desktop.getCurrentComponent()
try:
search = doc.createSearchDescriptor()
search.SearchRegularExpression = True
search.SearchString = "\\<(k|s|v|z|o|u|i|a) "
found = doc.findFirst( search )
while found:
found.String = found.String.replace( " ", u"\xa0" )
found = doc.findNext( found.End, search)
except:
pass
Wavelet クラスの登録
OpenOffice.org にコンポーネントのメインクラスを伝えなければいけません。次のコードを Wavelet.py ファイルの最後に追加してください。
g_ImplementationHelper = unohelper.ImplementationHelper()
g_ImplementationHelper.addImplementation(
Wavelet,
"name.vojta.openoffice.Wavelet",
("com.sun.star.task.Job",),)
コンポーネントの統合
アイコン
あなた独自のメニューの項目やツールバーのボタンのアイコンを作成できます。最も簡単なのは TrueColor の BMP ファイルを二つ作成することです。一つ目は 26 x 26 pixel に、もう一つは 16x16 pixel サイズにしておきます。
アルファ (透過) を利用したいのであれば #FF00FF (RGB) (マゼンタ) を使いましょう。
このアイコンは任意で作成します。無理に作成する必要はありません。
Addons.xcu
コンポーネント統合のためのコンフィグレーションを Addons.xcu ファイルに記述します。
ヘッダ
このファイルのヘッダは次のようにしなければいけません。
<?xml version="1.0" encoding="UTF-8"?>
<oor:component-data xmlns:oor="http://openoffice.org/2001/registry"
xmlns:xs="http://www.w3.org/2001/XMLSchema" oor:name="Addons"
oor:package="org.openoffice.Office">
<node oor:name="AddonUI">
オフィースメニューバー
次のパートでは Czech (または Cestina、ユーザーインターフェースの言語設定により違います) という新規メニュー項目をおよび "Wavelet" メニュー項目を作成します。
このメニュー項目は name.vojta.openoffice.Wavelet?execute URL に関連付けます。これはメニューをクリックしたときに Wavelet.trigger メソッドが execute という引数と共に呼ばれるということです。
このメニューは OpenOffice.org Writer にのみ表示されます。
<node oor:name="OfficeMenuBar">
<node oor:name="name.vojta.openoffice.Wavelet" oor:op="replace">
<prop oor:name="Title" oor:type="xs:string">
<value/>
<value xml:lang="en-US">Czech</value>
<value xml:lang="cs">Cestina</value>
</prop>
<prop oor:name="Target" oor:type="xs:string">
<value>_self</value>
</prop>
<prop oor:name="ImageIdentifier" oor:type="xs:string">
<value/>
</prop>
<node oor:name="Submenu">
<node oor:name="m1" oor:op="replace">
<prop oor:name="URL" oor:type="xs:string">
<value>service:name.vojta.openoffice.Wavelet?execute</value>
</prop>
<prop oor:name="Title" oor:type="xs:string">
<value/>
<value xml:lang="en-US">Wavelet</value>
<value xml:lang="cs">Vlnka</value>
</prop>
<prop oor:name="Target" oor:type="xs:string">
<value>_self</value>
</prop>
<prop oor:name="Context" oor:type="xs:string">
<value>com.sun.star.text.TextDocument</value>
</prop>
</node>
</node>
</node>
</node>
オフィースツールバー
次のパートでは一つのボタンを持った新規ツールバー (Add-on 1 や Add-on 2, ... というツールバー名を持ったもの) を作成します。このボタンは name.vojta.openoffice.Wavelet?execute URL に関連付けます。これは、ツールバーのこのボタンが押されたときに "Wabelet.trigger" メソッドが実行されるということです。execute が引数として渡されます。
注: ツールバー名を変更することができません。これは旧バージョン 1.1.x 系との互換性のためです。
<node oor:name="OfficeToolBar">
<node oor:name="name.vojta.openoffice.Wavelet" oor:op="replace">
<node oor:name="m1" oor:op="replace">
<prop oor:name="URL" oor:type="xs:string">
<value>service:name.vojta.openoffice.Wavelet?execute</value>
</prop>
<prop oor:name="ImageIdentifier" oor:type="xs:string">
<value/>
</prop>
<prop oor:name="Title" oor:type="xs:string">
<value/>
<value xml:lang="en-US">Wavelet</value>
<value xml:lang="cs">Vlnka</value>
</prop>
<prop oor:name="Target" oor:type="xs:string">
<value>_self</value>
</prop>
<prop oor:name="Context" oor:type="xs:string">
<value>com.sun.star.text.TextDocument</value>
</prop>
</node>
</node>
</node>
アイコン
アイコンをすべての URL と関連付けることができます。アイコンを name.vojta.openoffice.Wavelet?execute URL と関連付けることにします。これは、同じ "URL" に関連付けられたすべてのコントロール (メニュー項目、ボタンなど) がこれらのアイコンを使用するということです。
注: %origin% は UNO コンポーネントパッケージです。これについては後述します。
<node oor:name="Images">
<node oor:name="name.vojta.openoffice.Wavelet.image1" oor:op="replace">
<prop oor:name="URL">
<value>service:name.vojta.openoffice.Wavelet?execute</value>
</prop>
<node oor:name="UserDefinedImages">
<prop oor:name="ImageSmallURL" oor:type="xs:string">
<value>%origin%/images/WaveletSmall.bmp</value>
</prop>
<prop oor:name="ImageBigURL" oor:type="xs:string">
<value>%origin%/images/WaveletBig.bmp</value>
</prop>
</node>
</node>
</node>
フッタ
開いているセクションをすべて閉じます。
</node>
</oor:component-data>
UNO コンポーネントパッケージ
UNO コンポーネントパッケージは単純な ZIP ファイルです。パッケージは Addons.xcu ファイル、アイコンを入れた images ディレクトリおよび Python コンポーネントの実装を含んでいることは言うまでもありません。
パッケージ作成
次のコマンドでサンプルパッケージを作成できます。
zip -r Wavelet.uno.zip Addons.xcu Wavelet.py images
最終的に Wavelet.uno.zip パッケージに次のファイルが含まれているはずです。
Wavelet.uno.zip
Addons.xcu
Wavelet.py
images/WaveletBig.bmp
images/WaveletSmall.bmp
注: %origin% は Wavelet.uno.zip になります。従って、 %origin%/images/WaveletBig.bmp は Wavelet.uno.zip ファイル中の WaveletBig.bmp ファイルを指します。 訳注: 現在の実装では %origin% はコンフィグレーションファイルの位置を指します。
インストール
UNO コンポーネントを拡張機能マネージャ (ツールメニューにあると思われます) または unopkg ツールでインストールできます。
/opt/openoffice.org1.9.103/program/unopkg add Wavelet.uno.zip
アンインストール
UNO コンポーネントを拡張機能マネージャ (ツールメニューにあるでしょう) または unopkg ツールでアンインストールできます。
/opt/openoffice.org1.9.103/program/unopkg remove Wavelet.uno.zip
Python コンポーネントのテスト
Python UNO コンポーネントをテストするためにそのコンポーネントをインストールする必要はありません。実行されている OpenOffice.org のインスタンスに接続して UNO コンポーネントをテストできます。
コード
次のコードを Wavelet.py ファイルの最後に追加してください。
if __name__ == "__main__":
import os
# Start OpenOffice.org, listen for connections and open testing document
os.system( "/etc/openoffice.org-1.9/program/soffice '-accept=socket,host=localhost,port=2002;urp;' -writer ./WaveletTest.odt &" )
# Get local context info
localContext = uno.getComponentContext()
resolver = localContext.ServiceManager.createInstanceWithContext(
"com.sun.star.bridge.UnoUrlResolver", localContext )
ctx = None
# Wait until the OO.o starts and connection is established
while ctx == None:
try:
ctx = resolver.resolve(
"uno:socket,host=localhost,port=2002;urp;StarOffice.ComponentContext" )
except:
pass
# Trigger our job
wavelet = Wavelet( ctx )
wavelet.trigger( () )
テスト
UNO コンポーネントをテストするには、Wavelet.py ファイルを Python インタープレタからただ実行してください。
/opt/openoffice.org1.9.103/program/python ./Wavelet.py
概要
このパートでは次のことを行います。
OpenOffice.org を開始して WaveletTest.odt ファイルを開きます。
接続が確立するまでループします。
コンポーネントを 実行中の OpenOffice.org context で開始します。
注: 実際の UNO コンポーネントパッケージを作成するときにこのパートを削除するのを忘れないでください。もしくはコメントにしてください。 訳注: 実際には削除する必要はありません。パッケージ内で実行されるときにはモジュールが __main__ でないので実行されません。
参照
- Extensions chapter of the Developers Guide
- Using C++ with OOo SDK : Constructing Component in C++
- UNO tutorial
- UNO IDL
- Uno/Article/Types&Reflection
- Daniel Bolzle's tutorial : Writing a simple UNO component.
- Component with Python