前の関連記事: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の解説。
0 件のコメント:
コメントを投稿