UNO component packaging ja

From Apache OpenOffice Wiki
Jump to: navigation, search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

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 1Add-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.bmpWavelet.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__ でないので実行されません。


参照

Personal tools