前の関連記事:LibreOffice5(149)TypeDescriptionオブジェクトのサービスとインターフェイスの一覧
v3の変更点
メソッド名の変更とメソッドの追加
├─pq.Tcu
│ └─pq.XTcu
│ [string] treelines( [in] any Object)
│ void wcompare( [in] any Object1,
│ [in] any Object2)
│ [string] wcomparelines( [in] any Object1,
│ [in] any Object2)
│ void wtree( [in] any Object)
│ [string] wtreelines( [in] any Object)
└─.awt.XContainerWindowEventHandler
boolean callHandlerMethod( [in] .awt.XWindow xWindow,
[in] any EventObject,
[in] string MethodName
) raises ( .lang.WrappedTargetException)
[string] getSupportedMethodNames()
│ └─pq.XTcu
│ [string] treelines( [in] any Object)
│ void wcompare( [in] any Object1,
│ [in] any Object2)
│ [string] wcomparelines( [in] any Object1,
│ [in] any Object2)
│ void wtree( [in] any Object)
│ [string] wtreelines( [in] any Object)
└─.awt.XContainerWindowEventHandler
boolean callHandlerMethod( [in] .awt.XWindow xWindow,
[in] any EventObject,
[in] string MethodName
) raises ( .lang.WrappedTargetException)
[string] getSupportedMethodNames()
文字列のシークエンスを返していたtree()メソッドをtreelines()メソッドに名称変更しました。
さらにAPIリファレンスへのリンクをつけてウェブブラウザにツリーを出力するwtree()メソッドとwcompare()メソッドに追加して、それぞれの結果を文字列のシークエンスを返すようにした、wtreelines()メソッドとwcomparelines()メソッドを追加しました。
APIリファレンスへのリンクの404エラーを解消
ツリーにでてくるIDL名には、SERVICE、INTERFACE、EXCEPTION、STRUCT、ENUM、TYPEDEF、CONSTANTSがあります。
これらのうちv2まではSERVICE、INTERFACE、EXCEPTION、STRUCTは正しくAPIリファレンスへのリンクが貼れていましたが、ENUM、TYPEDEF、CONSTANTSについては404エラーになっていました。
というのもIDL名からSTRUCT、ENUM、TYPEDEF、CONSTANTSを判別する方法がわからなかったからです。
それがIDL名からTypeDescriptionを取得してそのgetTypeClass()メソッドの戻り値から判別できることがわかったので、v3ではそれらを判別してアンカーをつけるようにしました。
しかし、ENUMとTYPEDEFのURLフラグメントはdoxgenが作成したランダムなもののようで取得方法がわからなかったので、それぞれモジュールのENUMの一覧、TYPEDEFの一覧へのアンカーをつけるようにしました。
XPropertySetInfoインターフェイスがあるときのみプロパティ名一覧を取得する
オブジェクトを渡したときにオブジェクトのgetProperties()メソッドでプロパティ名一覧を取得しています。
しかしgetProperties()メソッドはこんなに種類があって、それぞれ戻り値が異なり、オブジェクトがXPropertySetInfoインターフェイス以外のgetProperties()メソッドをもっているとエラーになってしまいます。
なので、オブジェクトがXPropertySetInfoインターフェイスをもっているときのみ、getProperties()メソッドでプロパティ名一覧を取得するようにしました。
getSupportedServiceNames()メソッドの戻り値の間違いを指摘する
拡張機能でUNOコンポーネントを実装するとき、XServiceInfoインターフェイスのgetSupportedServiceNames()メソッドでサポートサービス名の文字列のタプルを返さないといけません。
XTypeProviderインターフェイスのgetTypes()メソッドはunohelper.pyで自動的に戻り値を作成してくれますが、getSupportedServiceNames()メソッドは打ち込まないといけないせいか、サービス名ではないものが返ってくることがあります。
なので、そのときはその旨のメッセージを出力することにしました。
wtreelines()メソッドの使い方の例
def macro():
ctx = XSCRIPTCONTEXT.getComponentContext() # コンポーネントコンテクストの取得。
smgr = ctx.getServiceManager() # サービスマネージャーの取得。
tcu = smgr.createInstanceWithContext("pq.Tcu", ctx) # サービス名か実装名でインスタンス化。
doc = XSCRIPTCONTEXT.getDocument()
controller = doc.getCurrentController() # コントローラの取得。
frame = controller.getFrame() # フレームを取得。
containerwindow = frame.getContainerWindow()
lines = tcu.wtreelines(containerwindow.getToolkit())
toBrowser(lines)
g_exportedScripts = macro, #マクロセレクターに限定表示させる関数をタプルで指定。
from wsgiref.simple_server import make_server
import webbrowser
_resp = '''\
<html>
<head>
<title>{0}</title>
<meta charset="UTF-8">
</head>
<body>
{1}
</body>
</html>''' # ローカルファイルとして開くときは<meta charset="UTF-8">がないと文字化けする。
class Wsgi:
def __init__(self, title, html):
self.resp = _resp.format(title, html)
def app(self, environ, start_response): # WSGIアプリ。引数はWSGIサーバから渡されるデフォルト引数。
start_response('200 OK', [ ('Content-type','text/html; charset=utf-8')]) # charset=utf-8'がないと文字化けする時がある
yield self.resp.encode() # デフォルトエンコードはutf-8
def wsgiServer(self):
host, port = "localhost", 8080 # サーバが受け付けるポート番号を設定。
httpd = make_server(host, port, self.app) # appへの接続を受け付けるWSGIサーバを生成。
url = "http://localhost:{}".format(port) # 出力先のurlを取得。
webbrowser.open_new_tab(url) # デフォルトブラウザでurlを開く。
httpd.handle_request() # リクエストを1回だけ受け付けたらサーバを終了させる。ローカルファイルはセキュリティの制限で開けない。
def toBrowser(lines):
outputs = ['<tt style="white-space: nowrap;">'] # 出力行を収納するリストを初期化。等幅フォントのタグを指定。
outputs.extend(lines)
outputs.append("</tt>")
html = "<br>".join(outputs).replace(" "*2, " "*2).replace(" "*3, " "*3).replace(" "*4, " "*4) # 連続したスペースはブラウザで一つにされるのでnbspに置換する。一つのスペースを置換するとタグ内まで置換されるのでダメ。
title = "TCU - Tree Command for UNO"
server = Wsgi(title, html)
server.wsgiServer()
9行目でツールキットをwtreelines()メソッドに渡してそのサービスとインターフェイスの一覧のAPIリファレンスへのアンカー付きツリーの行のタプルを取得しています。12行名以降はそれをデフォルトウェブブラウザに出力している部分です。
結果はwtree()メソッドと同じなります。

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