前の関連記事:LibreOffice5(59)モードレスダイアログの例をPythonに翻訳する:その5
マクロで実行できるようにする、UnoControlDialogを使う
マクロで実行できるようにするためにはコンポーネントコンテクスト、デスクトップ、ドキュメントをXSCRIPTCONTEXTから取得するように変更します。
サービスマネージャーはコンポーネントコンテクストから取得します。
ctx = XSCRIPTCONTEXT.getComponentContext() # コンポーネントコンテクストの取得。 smgr = ctx.getServiceManager() # サービスマネージャーの取得。 doc = XSCRIPTCONTEXT.getDocument() # マクロを起動した時のドキュメントのモデルを取得。あとはマクロセレクターでこの関数を呼び出せば実行できました。
次にLibreOffice5(59)モードレスダイアログの例をPythonに翻訳する:その5のマクロをオートメーションで実行するためのコードをくっつけてオートメーションから実行してみました。
なぜかドキュメントウィンドウをマウスでアクティブにしないと実行されないときがあります。
再現条件を確定できず原因は特定できていませんが、時間をあけてオートメーションで起動すると再発する印象です。
ドキュメントウィンドウを選択するとダイアログが起動します。
ドキュメントのロード待ちのwhile文で止まっていると思われます。
splitter_unocontroldialog.py
コンポーネントウィンドウにUnoControlContainer(XTopWindowをもっていないのでコンテナウィンドウにはなれない)を入れるのではなく、UnoControlDialogをコンテナウィンドウにしてダイアログを作成するようにしました。
リサイズできる区切りをtoolkit.createWindow()で作成する点は変えていません。
WindowServiceNameの解説がみつからない
このWindowServiceNameというのがよくわかりません。
LibreOffice: WindowDescriptor Struct Reference
このAPIリファレンスをみるとWindowServiceNameに入る文字列が列挙されています。
25行目で定義しているWindowServiceNameをsplitterからdialogに変更してみると区切りが表示されなくなりましたので、splitterとして機能させようと思うとやっぱりちゃんとWindowServiceNameをsplitterと定義していないといけないようです。
でもWindowServiceNameについての解説はいまのところ見つけられていません。
Windowのインスタンスに定義されているものを見ようとしてもデバッガで属性をさがしても見つけられませんでした。
UnoControlDialogのインスタンスのWindowServiceNameはdialogになっていると思うのですが、どこでそれを確認できるのかわかりませんでした。
参考にしたサイト
OOoBasic/Window/Splitter - ...?
ドラッグでサイズを調整できる splitter コントロールの例。
0 件のコメント:
コメントを投稿