UNO component packaging ja

From Apache OpenOffice Wiki
Revision as of 18:23, 21 May 2008 by Hanya (Talk | contribs)

(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search

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 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