LibreOffice(54)サービス属性、インターフェイス属性、メソッドも枝付きで出力

ラベル: ,

前の関連記事:LibreOffice(53)オブジェクトがもつサービスとインターフェイスをpreorder(行きかけ順)に出力


サービス属性やインターフェイスメソッドも枝に出力します。

これで出力したいものはすべて出力できた


(2015.11.3追記。この記事で作ったlibreoffice54.pyはサービスをサポートしているUNOオブジェクトが直接もっているインテーフェイスの出力漏れがありました。LibreOffice5(4)unoinsp.pyの修正参照。)

サービスとインターフェイスの区別をcom.sun.star.uno.TypeClassのenumで判別するようにし、降順の並び替えをsortedのreverseでする方法に変更しました。

libreoffice54.py

サービスやインターフェイスと同様にサービス属性名もスタックに加えて同じように枝を出力しようとしたのですが、サービス属性名からXPropertyTypeDescriptionインターフェイスをもつTypeDescriptionオブジェクトをgetByHierarchicalName()で得ることができませんでした。

ということで枝を出力するときに使うスタックには名前ではなく、TypeDescriptionオブジェクトをいれることにしました。

libreoffice54.py

結構あれこれ修正が必要でした。

オブジェクトは直接ソートできないので、ラムダ関数を使ってオブジェクトの属性をkeyとしています。

branchの2番目の要素は次に使います。

libreoffice54.py

サービス属性も出力するようにしました。

LibreOffice(46)インターフェイス名からその属性とメソッド名一覧を取得を参考にインターフェイス属性とメソッドも出力します。

libreoffice54.py

だんだんと自分でもわからなくなってきてデバッガ頼りでちょこちょこ修正して完成させました。

いちおう目的にかなった出力が得られましたが、コードは無駄が多いです。

下記はToolkitオブジェクトの出力例です。
com.sun.star.awt.Toolkit
└─com.sun.star.awt.XToolkit2
      ├─com.sun.star.awt.XDataTransferProviderAccess
      │               com.sun.star.datatransfer.clipboard.XClipboard  getClipboard( [in] string clipboardName)
      │         com.sun.star.datatransfer.dnd.XDragGestureRecognizer  getDragGestureRecognizer( [in] com.sun.star.awt.XWindow window)
      │                    com.sun.star.datatransfer.dnd.XDragSource  getDragSource( [in] com.sun.star.awt.XWindow window)
      │                    com.sun.star.datatransfer.dnd.XDropTarget  getDropTarget( [in] com.sun.star.awt.XWindow window)
      ├─com.sun.star.awt.XExtendedToolkit
      │                                void  addFocusListener( [in] com.sun.star.awt.XFocusListener xListener)
      │                                void  addKeyHandler( [in] com.sun.star.awt.XKeyHandler xHandler)
      │                                void  addTopWindowListener( [in] com.sun.star.awt.XTopWindowListener xListener)
      │                                void  fireFocusGained( [in] com.sun.star.uno.XInterface source)
      │                                void  fireFocusLost( [in] com.sun.star.uno.XInterface source)
      │         com.sun.star.awt.XTopWindow  getActiveTopWindow()
      │         com.sun.star.awt.XTopWindow  getTopWindow( [in] long nIndex
      │                                         ) raises ( com.sun.star.lang.IndexOutOfBoundsException)
      │                                long  getTopWindowCount()
      │                                void  removeFocusListener( [in] com.sun.star.awt.XFocusListener xListener)
      │                                void  removeKeyHandler( [in] com.sun.star.awt.XKeyHandler xHandler)
      │                                void  removeTopWindowListener( [in] com.sun.star.awt.XTopWindowListener xListener)
      ├─com.sun.star.awt.XMessageBoxFactory
      │         com.sun.star.awt.XMessageBox  createMessageBox( [in]    com.sun.star.awt.XWindowPeer aParent,
      │                                                         [in] com.sun.star.awt.MessageBoxType eType,
      │                                                         [in]                            long nButtons,
      │                                                         [in]                          string sTitle,
      │                                                         [in]                          string sMessage)
      ├─com.sun.star.awt.XReschedule
      │         void  reschedule()
      ├─com.sun.star.awt.XSystemChildFactory
      │         com.sun.star.awt.XWindowPeer  createSystemChild( [in]    any Parent,
      │                                                          [in] [byte] ProcessId,
      │                                                          [in]  short SystemType)
      └─com.sun.star.awt.XToolkit
                        com.sun.star.awt.XRegion  createRegion()
                        com.sun.star.awt.XDevice  createScreenCompatibleDevice( [in] long Width,
                                                                                [in] long Height)
                    com.sun.star.awt.XWindowPeer  createWindow( [in] com.sun.star.awt.WindowDescriptor Descriptor
                                                     ) raises ( com.sun.star.lang.IllegalArgumentException)
                  [com.sun.star.awt.XWindowPeer]  createWindows( [in] [com.sun.star.awt.WindowDescriptor] Descriptors
                                                      ) raises ( com.sun.star.lang.IllegalArgumentException)
                    com.sun.star.awt.XWindowPeer  getDesktopWindow()
                      com.sun.star.awt.Rectangle  getWorkArea()
libreoffice54.py

ちょっと簡単に修正できそうな冗長なところを直しました。

「com.sun.star」の表記を省略する


「com.sun.star」の表記はどれも同じなのでこれも省いてしまいます。

print()の引数に「.replace("com.sun.star", "")」をつけるだけでよいと思っていたのですが、そうすると縦の行頭が揃いませんでした。

文字数を求めるときも「.replace("com.sun.star", "")」をつければよいとも思ったのですがそれでも行頭が揃いません。

原因はstr.rjust(文字数)で右寄せしたあとに置換しているのが原因でした。

ということで取得時に削除することにします。

libreoffice54.py

30行目でgetByHierarchicalName()の引数は"com.sun.star"を省略できないので削ったものをわざわざ追加しています。
.awt.Toolkit
└─.awt.XToolkit2
      ├─.awt.XDataTransferProviderAccess
      │               .datatransfer.clipboard.XClipboard  getClipboard( [in] string clipboardName)
      │         .datatransfer.dnd.XDragGestureRecognizer  getDragGestureRecognizer( [in] .awt.XWindow window)
      │                    .datatransfer.dnd.XDragSource  getDragSource( [in] .awt.XWindow window)
      │                    .datatransfer.dnd.XDropTarget  getDropTarget( [in] .awt.XWindow window)
      ├─.awt.XExtendedToolkit
      │                    void  addFocusListener( [in] .awt.XFocusListener xListener)
      │                    void  addKeyHandler( [in] .awt.XKeyHandler xHandler)
      │                    void  addTopWindowListener( [in] .awt.XTopWindowListener xListener)
      │                    void  fireFocusGained( [in] .uno.XInterface source)
      │                    void  fireFocusLost( [in] .uno.XInterface source)
      │         .awt.XTopWindow  getActiveTopWindow()
      │         .awt.XTopWindow  getTopWindow( [in] long nIndex
      │                             ) raises ( .lang.IndexOutOfBoundsException)
      │                    long  getTopWindowCount()
      │                    void  removeFocusListener( [in] .awt.XFocusListener xListener)
      │                    void  removeKeyHandler( [in] .awt.XKeyHandler xHandler)
      │                    void  removeTopWindowListener( [in] .awt.XTopWindowListener xListener)
      ├─.awt.XMessageBoxFactory
      │         .awt.XMessageBox  createMessageBox( [in]    .awt.XWindowPeer aParent,
      │                                             [in] .awt.MessageBoxType eType,
      │                                             [in]                long nButtons,
      │                                             [in]              string sTitle,
      │                                             [in]              string sMessage)
      ├─.awt.XReschedule
      │         void  reschedule()
      ├─.awt.XSystemChildFactory
      │         .awt.XWindowPeer  createSystemChild( [in]    any Parent,
      │                                              [in] [byte] ProcessId,
      │                                              [in]  short SystemType)
      └─.awt.XToolkit
                        .awt.XRegion  createRegion()
                        .awt.XDevice  createScreenCompatibleDevice( [in] long Width,
                                                                    [in] long Height)
                    .awt.XWindowPeer  createWindow( [in] .awt.WindowDescriptor Descriptor
                                         ) raises ( .lang.IllegalArgumentException)
                  [.awt.XWindowPeer]  createWindows( [in] [.awt.WindowDescriptor] Descriptors
                                          ) raises ( .lang.IllegalArgumentException)
                    .awt.XWindowPeer  getDesktopWindow()
                      .awt.Rectangle  getWorkArea()

次の関連記事:LibreOffice(55)WSGIでブラウザに結果を出力する

PR

0 件のコメント:

コメントを投稿