UNO component packaging ja
Contents
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 import string 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 = string.replace( found.String, " ", 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