Calc(37)コンテクストメニューをカスタマイズする: その6

2017-11-02

旧ブログ

t f B! P L
notifyContextMenuExecute()の引数で与えられるContextMenuExecuteEvent Strcutについて調べます。右クリックした位置の情報を取得する方法を探していましたが、ようやくみつかりました。

前の関連記事:Calc(36)コンテクストメニューをカスタマイズする: その5


ContextMenuExecuteEvent Strcutのアトリビュート


セルを右クリックしたときのContextMenuExecuteEvent Strcutをデバッガで調べました。

ExecutePositionアトリビュート

Point StructでXY座標が入っています。

この座標はその数値から推測して、コンポーネントウィンドウの左上を原点にして右下方に向かう座標のようです。

クリックした位置がわかる固有情報ですが、いまのところこれの活用方法は思いつきません。

Selectionアトリビュート

これは選択しているセルやセル範囲が入っていると思いましたが、そうではなくてCalc(19)Calcコントローラのサービスとインターフェイス一覧と一致したので、Calcのコントローラが入っているとわかりました。

選択しているセルやセル範囲はこのコントローラからgetSelection()で取得することになります。

SourceWindowアトリビュート

コンテクストメニューを実行したウィンドウが入っています。

ExecutePositionがコンポーネントウィンドウに対する座標だし、SelectionにCalcコントローラが入っていることから、これはコンポーネントウィンドウに思います。

TCUでみてみると、XTopWindowインターフェイスがないので、これはコンポーネントウィンドウで正解ですね(LibreOffice(32)デベロッパーガイド4:コンポーネントフレームワークLibreOffice5(118)コンポーネントウィンドウのサービスとインターフェイスの一覧参照)。

ActionTriggerContainerアトリビュート

これにはActionTriggerContainerサービスのインスタンスが入っています。

このアトリビュートに入っているオブジェクトのサービスとインターフェイス一覧がCalc(86)ActionTriggerContainer、ActionTrigger、ActionTriggerSeparatorのサービスとインターフェイスの一覧にあります。

このツリーの最後にでてくるgetName()の戻り値をみつけて、ようやくコンテクストメニューのクリック位置を知る手掛かりをつかみました。

APIリファレンスしかみていなかったので、このメソッドがあることに気が付きませんでした。

ActionTriggerContainerアトリビュートのgetName()の戻り値


右クリックした位置によるActionTriggerContainerアトリビュートのgetName()の戻り値をみてみます。

セルのとき private:resource/popupmenu/cell

行ヘッダーのとき private:resource/popupmenu/rowheader

列ヘッダーのとき private:resource/popupmenu/colheader

シートタブのとき private:resource/popupmenu/sheettab

これで右クリックした位置の区別ができそうです。

シートタブのときは、シートタブ上だけでなく、シートタブが表示される領域であればそこにシートタブがなくても上の名前が返ってきます。

このprivate:というのはOOoBasic/Generic/UCB - ...?にあるUCPの1つのようです。

/opt/libreoffice5.4/share/registry/main.xcdをoor:name="ContentProviders"で検索してその中のoor:name="URLTemplate"のpropノードにprivateをみつけることができます。

参考にしたサイト


OOoBasic/Generic/UCB - ...?
UCPの解説。

次の関連記事:Calc(38)ディスパッチコマンドのラベル一覧の取得

ブログ検索 by Blogger

Translate

最近のコメント

Created by Calendar Gadget

QooQ