前の関連記事: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()

0 件のコメント:
コメントを投稿