LibreOffice5(61)オプションダイアログの作成例: MaximumPageSize.oxt

2017-07-17

旧ブログ

t f B! P L
デベロッパーガイドには拡張機能の設定にはメニューを使わずに、オプションダイアログを使うようにと書いてあります(Options Dialog - Apache OpenOffice Wiki)Extensions/Options - ...?にある解説とOOobbs2/71 - ...?にある例MaximumPageSize.oxtを参考にします。

前の関連記事:LibreOffice5(60)ドラッグでリサイズできるsplitterコントロールの例


オプションダイアログの例 拡張機能:MaximumPageSize.oxt


OOobbs2/71 - ...?からMaximumPageSize.oxtをダウンロードして、拡張機能マネージャーでLibreOfficeに登録します。

するとツール→オプション、の左側の枠に「拡張機能」という項目が新たに出現し、その下の「最大用紙サイズ」を選択すると新しいオプションダイアログができているのがわかります。


左の枠に「拡張機能」という項目が出現しその下にある「最大用紙サイズ」を選択すると右側に新たに追加されたオプションダイアログが表示されます。

表示されている値は/opt/libreoffice5.2/share/registry/main.xcdから読み込んだものです。 

しかしMaximumPageSize.oxtでは小数点以下2桁を保存するために2桁繰り上げて処理しているのに対して、main.xcdに設定している値は繰り上げてないので2桁低い値になっています。

MaximumPageSize.oxtで変更している値


MaximumPageSize.oxtで変更している値はソースをみないといけません。

MaximumPageSize.oxtファイルはzipファイルなので中にあるDialogHandler.pyを取り出して読むと、/org.openoffice.Office.Common/Drawinglayerの下にあるMaximumPaperHeightとMaximumPaperWidthを変更しているとわかります。

これらはドキュメントのメニューから書式→ページ、で表示される「用紙サイズ」で設定できる「幅」と「高さ」の上限値を決めるものです。
(2017.7.18追記。どの種類のドキュメントかはいまのところわかりません。)

これらのデフォルト値は/opt/libreoffice5.2/share/registry/main.xcdで確認できます。
<oor:component-schema oor:package="org.openoffice.Office" oor:name="Common" xml:lang="en-US">
<templates>...</templates>
<component>
    <group oor:name="VCL">...</group>
    <group oor:name="InternalMSExport">...</group>
    <group oor:name="Passwords">...</group>
    <group oor:name="Dictionaries">...</group>
    <group oor:name="Drawinglayer">
        <prop oor:name="OverlayBuffer" oor:type="xs:boolean" oor:nillable="false">...</prop>
        <prop oor:name="OverlayBuffer_Calc" oor:type="xs:boolean" oor:nillable="false">...</prop>
        <prop oor:name="OverlayBuffer_Writer" oor:type="xs:boolean" oor:nillable="false">...</prop>
        <prop oor:name="OverlayBuffer_DrawImpress" oor:type="xs:boolean" oor:nillable="false">...</prop>
        <prop oor:name="PaintBuffer" oor:type="xs:boolean" oor:nillable="false">...</prop>
        <prop oor:name="PaintBuffer_Calc" oor:type="xs:boolean" oor:nillable="false">...</prop>
        <prop oor:name="PaintBuffer_Writer" oor:type="xs:boolean" oor:nillable="false">...</prop>
        <prop oor:name="PaintBuffer_DrawImpress" oor:type="xs:boolean" oor:nillable="false">...</prop>
        <prop oor:name="StripeColorA" oor:type="xs:int" oor:nillable="false">...</prop>
        <prop oor:name="StripeColorB" oor:type="xs:int" oor:nillable="false">...</prop>
        <prop oor:name="StripeLength" oor:type="xs:short" oor:nillable="false">...</prop>
        <prop oor:name="MaximumPaperWidth" oor:type="xs:int" oor:nillable="false">
            <value>300</value>
        </prop>
        <prop oor:name="MaximumPaperHeight" oor:type="xs:int" oor:nillable="false">
            <value>300</value>
        </prop>
MaximumPaperWidthもMaximumPaperHeightも値は300になっています。


書式→ページ、で表示される「用紙サイズ」の幅と高さは300cm以上大きくしても300cmになってしまいますから、MaximumPaperWidthとMaximumPaperHeightの値の単位はcmのようです。

MaximumPageSize.oxtで取得しているデフォルト値の3.00cmというのは上に書いたように桁の処理の相違のためです。
(2017.7.18追記setPropertyValues()メソッドの引数に小数が使えないので、100倍にして値を代入しているとわかりました。しかしデフォルト値が書いてあるmain.xcdは100倍になっていません。MaximumPageSize.oxtはlongをintに書き換えてPython3にしないとOKボタンを押しても値が保存されません。)

MaximumPageSize.oxtに含まれるファイル

.
├── DialogHandler.py
├── META-INF
│   └── manifest.xml
├── OptionsDialog.xcu
└── dialogs
    ├── MaximumPaperSize
    │   ├── mytoolsExtensionsMaximumPaperSize.xdl
    │   ├── mytoolsExtensionsMaximumPaperSize_en_US.default
    │   ├── mytoolsExtensionsMaximumPaperSize_en_US.properties
    │   └── mytoolsExtensionsMaximumPaperSize_ja_JP.properties
    └── node
        ├── mytoolsExtensionsNode.xdl
        ├── mytoolsExtensionsNode_en_US.default
        ├── mytoolsExtensionsNode_en_US.properties
        └── mytoolsExtensionsNode_ja_JP.properties
MaximumPageSize.oxtに含まれているファイルはこのようになっています。

dialogsフォルダにあるxdlファイルはダイアログエディタで作成されたダイアログになっています。

MaximumPaperSizeフォルダに入っているダイアログはオプションダイアログだとわかりましたが、もう一つのnodeフォルダに入っているダイアログの働きがよくわかりませんでした。

削除してみましたが動作に支障はないようでした。

ダイアログエディタでこれらxdlファイルを開くとレイアウトは確認できますが、言語ファイルをダイアログエディタに読み込む方法がわかりませんでした。
(ダイアログエディタについてはLibreOffice5(29)ダイアログエディタの言語ツールバーを利用する方法参照)

dialogフォルダ下のnodeフォルダを削除したのでそれに対応したOptionsDialog.xcuファイルにあるNodesノードにあるmytoolsExtensionsNode.xdlファイルを値にもっているOptionsPageノードも削除しました。
.
├── DialogHandler.py
├── META-INF
│   └── manifest.xml
├── OptionsDialog.xcu
└── dialogs
    └── MaximumPaperSize
        ├── mytoolsExtensionsMaximumPaperSize.xdl
        ├── mytoolsExtensionsMaximumPaperSize_en_US.default
        ├── mytoolsExtensionsMaximumPaperSize_en_US.properties
        └── mytoolsExtensionsMaximumPaperSize_ja_JP.properties
これでだいぶファイル構成がすっきりしました。

MaximumPageSize.oxtのソースをPyDevプロジェクトにする


あれこれいじって働きを理解したいので、ワンステップでソースからoxtファイルを作成してLibreOfficeの拡張機能マネージャーに登録できるようにします。

LibreOffice5(42)UNOIDLの引数の型の例:文字列を渡すと同様にしてPyDevプロジェクトを作成してsrcフォルダにMaximumPageSize.oxtを解凍した中身をいれました。

srcフォルダと同じ階層にLibreOffice5(44)createInstanceWithArgumentsAndContext()でインスタンス化で作成してtoolsフォルダをコピーしました。

OptionDialog/OptionDialog at 2f970ec249c4623d9404432dd5786551dfcb734c · p--q/OptionDialog

結局とりあえずoxtファイルを一発で作れるまでにあれこれいじりました。

createOXT.pyでxdlファイルを取り込めるようにdialogフォルダ下のファイルをすべてoxtファイルに含めるようにしました。

好きにコードを書いてよいところと、ルールを守らないといけないところをスコープでわけたいので、oxtファイルの中の一番上の階層にあるpyファイルはサービス名と実装サービス名の指定だけにとどめて実際に働くコードはpythonpathフォルダに移動させました。
IMPLE_NAME = "com.pq.blogspot.comp.MaximumPaperSize"  # 実装サービス名
SERVICE_NAME = "com.pq.blogspot.MaximumPaperSize"  # サービス名
def create(ctx, *args):    
        from optiondialog import component  # pythopathフォルダのモジュールの取得。
        return component.create(ctx, *args, imple_name=IMPLE_NAME, service_name=SERVICE_NAME)
# Registration
import unohelper
g_ImplementationHelper = unohelper.ImplementationHelper()
g_ImplementationHelper.addImplementation(create, IMPLE_NAME, (SERVICE_NAME,),)
oxtファイルの中の一番上の階層に置いたdialoghandler.pyファイルです。

ここで好きにしてよいのは3,4,6行目だけです。

実装サービス名とサービス名は他の重ならなければ何でもよいようです。

今回はデベロッパーガイドのXServiceInfoに書いてあるように実装サービス名はサービス名の間にcompを挟んだものにしました。

この実装サービス名はoxtファイルを拡張機能マネージャーに登録するときに確定するようで、キャッシュで変更してしまうと拡張機能が動かなくなりました。

6行目でUNOコンポーネントにしている実際のクラスが書いてあるモジュールをpythonpathフォルダからインポートしています。

相対インポートが使えるようにpythonpathフォルダには直接pyファイルは置かないようにしています(LibreOffice5(47)拡張機能のソースをオートメーションでも実行する参照。)

dialoghandler.pyファイルが出来たらcreateXMLs.pyを実行して、manifest.xmlファイルと.componentsファイルを作成しておきます(LibreOffice5(38)Java Component ExampleをPythonに翻訳する参照)。

あとはcreateOXT.pyを実行するとoxtフォルダにOptionDialog.oxtファイルができています。

pythonpathフォルダのソースを変更するたびにexecAtOnce.pyを実行するだけでoxtファイルの作成とLibreOfficeの拡張機能マネージャーへの登録までできるようになります。

参考にしたサイト


Options Dialog - Apache OpenOffice Wiki
拡張機能の設定はオプションダイアログに使うべきとあります。options_dialog_for_extensions.odtは動きませんでした。

Extensions/Options - ...?
オプションダイアログのxcuファイルの書き方。

OOobbs2/71 - ...?
オプションダイアログの動く例があります。

XServiceInfo - Apache OpenOffice Wiki
実装サービス名の付け方。 <namespace_of_creator>.comp.<namespace_of_implementation>.<class_name> 。

Saving and Reading Data for the Options Page - Apache OpenOffice Wiki
オプションダイアログでのXContainerWindowEventHandlerインターフェイスの解説。

Creating the GUI of the Options Page - Apache OpenOffice Wiki
オプションダイアログのGUIの解説。

次の関連記事:LibreOffice5(62)Map AppFont (ma)とピクセル

ブログ検索 by Blogger

Translate

最近のコメント

Created by Calendar Gadget

QooQ