前の関連記事:LibreOffice5(22)ダイアログエディタでGUIを作成しPythonで利用する:その2
今回はダイアログエディタとは直接関係ない話です。LibreOffice5(22)ダイアログエディタでGUIを作成しPythonで利用する:その2で疑問に思ったDialogProviderサービスのインターフェイスを介さないメソッドについて調べました。
DialogProviderサービスはXInitializationインターフェイスを実装しているのでcreateInstanceWithArgumentsAndContext()でインスタンス化できる
com.sun.star.awt.DialogProviderサービスのインスタンスdpの属性をみてみます。
In [9]:
ins.itree(dp)
DialogProviderサービスに加えてContainerWindowProviderサービスとDialogProvider2サービスが実装されています。
さらにそれらサービスが持つインターフェイス以外にXInitializationインターフェイスとXServiceInfoインターフェイスも実装しています。
このXInitializationインターフェイスのinitialize()メソッドが実装されているとcreateInstanceWithArgumentsAndContext()メソッドが使えて
サービスをインスタンス化するときに引数を渡せます。
(XInitialization - Apache OpenOffice Wiki)
createInstanceWithArgumentsAndContext()でインスタンス化されるPythonのUNOコンポーネントの作成例をA. Python-UNO - N->N->Nの「コンポーネント」の項に見つけました。
Create Instance with Arguments - Apache OpenOffice Wikiの最後を読むとcreateInstanceWithArgumentsAndContext()でインスタンス化するためにXInitializationインターフェイスの実装は必須ではないようですが、XInitializationインターフェイスが実装されていればとりあえずcreateInstanceWithArgumentsAndContext()でインスタンス化できるといえそうです。
実際にDialogProviderサービスをcreateInstanceWithArgumentsAndContext()でインスタンス化している例をさがしてみるとOOoPython/Dialogs - ...?にありました。
createInstanceWithArgumentsAndContext()でDialogProviderサービスをインスタンス化しているのですが、インスタンス化するときの引数を見比べてみるとこれはDialogProviderサービスのcreateWithModelAndScripting()の引数と一致します。
APIリファレンスにはcreateWithModelAndScripting()メソッドの戻り値の型も解説も書いてありませんが、このメソッドが"create"するのはDialogProviderサービス自身のようです。
これらのメソッドはインターフェイスを介さないのでTypeDescriptionオブジェクトから取得できないようです。
他にも同様の例がないか探してみたところcom.sun.star.ui.dialogs.FilePickerサービスのcreateWithMode()メソッドを見つけました。
Python Marco - File Dialog für Datei Export - LibreOfficeForum.deでDialogProviderサービスと同様にcreateInstanceWithArgumentsAndContext()で引数をつけてインスタンス化されています。
(2017.8.29追記。FilePickerについてLibreOffice5(77)FilePickerのTemplateDescriptionを実行してみるでやりました。)
(2017.8.29追記。FilePickerについてLibreOffice5(77)FilePickerのTemplateDescriptionを実行してみるでやりました。)
LibreOffice 4.5 SDK - Developer's Guide ExamplesのDialogComponent.javaではcom.sun.star.awt.DialogProvider2サービスがcreateInstanceWithArgumentsAndContext()でModelを引数にインスタンス化されていますが、APIリファレンスではそれに該当するメソッドはなくこれはDialogProviderサービスのcreateWithModel()メソッドを使っているようです。
APIリファレンスの継承図を見ているだけではDialogProvider2サービスがXDialogProviderインターフェイスを継承しているのはわかりますが、DialogProviderサービスが直接持っているメソッドを継承していることはわかりません。
今回はここまでわかりましたがまだcreateInstanceWithArgumentsAndContext()の使いどころが私には理解できないです。
ダイアログエディタで作成したダイアログのオブジェクトのサポートサービス名に実装サービス名が含まれる
LibreOffice5(22)ダイアログエディタでGUIを作成しPythonで利用する:その2のIn[8]で取得したdlg_crtlの属性を調べてみます。
In [10]:
ins.itree(dlg_ctrl)
エラーがでて属性ツリーが取得できません。
原因はdlg_ctrlオブジェクトがgetSupportedServiceNames()メソッドでIDLにない実装サービス名のstardiv.vcl.control.Dialogを返すのが原因です。
In [11]:
dlg_ctrl
Out[11]:
stardiv.vcl.control.Dialog以外にTypeDescriptionオブジェクトを取得できない属性はないようですので実装サービス名は弾くようにunoinsp.pyを修正することにします。
参考にしたサイト
XInitialization - Apache OpenOffice Wiki
createInstanceWithArgumentsAndContext()でインスタンス化するためのインターフェイス。
A. Python-UNO - N->N->N
XInitializationインターフェイスのPythonの実装例。
Create Instance with Arguments - Apache OpenOffice Wiki
JavaでのcreateInstanceWithArgumentsAndContext()の解説ですがFactoryHelperというのがよくわかりません。
OOoPython/Dialogs - ...?
DialogProviderサービスのcreateWithModelAndScripting()メソッドの使用例と思われるもの。
Python Marco - File Dialog für Datei Export - LibreOfficeForum.de
com.sun.star.ui.dialogs.FilePickerサービスのcreateWithMode()メソッドの使用例と思われるもの。
0 件のコメント:
コメントを投稿