LibreOffice5(150)TCU v3

公開日: 2018年03月09日 更新日: 2019年05月11日

旧ブログ

t f B! P L
LibreOffice5(147)TCUの改良のv2をv3にしました。メソッドの変更もしました。

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

文字列のシークエンスを返していた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()メソッドの使い方の例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
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, "&nbsp;"*2).replace(" "*3, "&nbsp;"*3).replace(" "*4, "&nbsp;"*4# 連続したスペースはブラウザで一つにされるのでnbspに置換する。一つのスペースを置換するとタグ内まで置換されるのでダメ。
    title = "TCU - Tree Command for UNO"
    server = Wsgi(title, html)
    server.wsgiServer()
9行目でツールキットをwtreelines()メソッドに渡してそのサービスとインターフェイスの一覧のAPIリファレンスへのアンカー付きツリーの行のタプルを取得しています。

12行名以降はそれをデフォルトウェブブラウザに出力している部分です。

結果はwtree()メソッドと同じなります。

次の関連記事:LibreOffice5(151)UnicodeのVariation Selector で「辻」のしんにょうの点の個数を変える

ブログ検索 by Blogger

Translate

«
Mar. 2018
»
Sun
Mon
Tue
Wed
Thu
Fri
Sat
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
published: Mar. 9 2018
Created by Calendar Gadget

QooQ