前の関連記事:Calc(28)コンテクストメニューをカスタマイズする: その1
notifyContextMenuExecute()の戻り値: IGNOREDとCANCELLED
XContextMenuInterceptorインターフェイスのnotifyContextMenuExecute()メソッドはenumのContextMenuInterceptorActionを返さないといけません。
Calc(28)コンテクストメニューをカスタマイズする: その1のcontextmenuinterceptor.pyでこれらの戻り値をやってみます。
IGNORED
このContextMenuInterceptorは実行せず、次のContextMenuInterceptorは実行します。
これはこのContextMenuInterceptorだけが実行されなかったのと同じです。
つまり右クリックしてもデフォルトのコンテクストメニューが表示されるだけです。
CANCELLED
これはコンテクストメニューの表示自体をキャンセルします。
デフォルトのコンテクストメニューも表示されなくなりました。
つまり右クリックしても何も起こらなくなります。
notifyContextMenuExecute()の戻り値: EXECUTE_MODIFIEDとCONTINUE_MODIFIED
EXECUTE_MODIFIEDとCONTINUE_MODIFIEDはどちらもContextMenuInterceptorで設定したメニュー項目が表示されます。
違いがでるのは、複数のContextMenuInterceptorを同じコントローラに登録したときです。
CONTINUE_MODIFIED
コンテクストメニューを変更したあと次のContextMenuInterceptorを呼び出します。
# -*- coding: utf-8 -*-
import unohelper # オートメーションには必須(必須なのはuno)。
from com.sun.star.ui import XContextMenuInterceptor
from com.sun.star.ui import ActionTriggerSeparatorType # 定数
from com.sun.star.ui.ContextMenuInterceptorAction import EXECUTE_MODIFIED, IGNORED, CANCELLED, CONTINUE_MODIFIED # enum
def macro():
doc = XSCRIPTCONTEXT.getDocument() # ドキュメントのモデルを取得。
controller = doc.getCurrentController() # コントローラーを取得。
contextmenuinterceptor = ContextMenuInterceptor()
contextmenuinterceptor2 = ContextMenuInterceptor2()
controller.registerContextMenuInterceptor(contextmenuinterceptor)
controller.registerContextMenuInterceptor(contextmenuinterceptor2)
class ContextMenuInterceptor(unohelper.Base, XContextMenuInterceptor):
def notifyContextMenuExecute(self, contextmenuexecuteevent):
contextmenu = contextmenuexecuteevent.ActionTriggerContainer
submenucontainer = contextmenu.createInstance("com.sun.star.ui.ActionTriggerContainer")
addMenuentry(submenucontainer, "ActionTrigger", 0, {"Text": "Content", "CommandURL": ".uno:HelpIndex", "HelpURL": "5401"})
addMenuentry(submenucontainer, "ActionTrigger", 1, {"Text": "Tips", "CommandURL": ".uno:HelpTip", "HelpURL": "5404"})
addMenuentry(contextmenu, "ActionTrigger", 0, {"Text": "Help", "CommandURL": ".uno:HelpMenu", "HelpURL": "5410", "SubContainer": submenucontainer})
addMenuentry(contextmenu, "ActionTriggerSeparator", 1, {"SeparatorType": ActionTriggerSeparatorType.LINE})
return CONTINUE_MODIFIED # EXECUTE_MODIFIED, IGNORED, CANCELLED, CONTINUE_MODIFIED
class ContextMenuInterceptor2(unohelper.Base, XContextMenuInterceptor):
def notifyContextMenuExecute(self, contextmenuexecuteevent):
contextmenu = contextmenuexecuteevent.ActionTriggerContainer
submenucontainer = contextmenu.createInstance("com.sun.star.ui.ActionTriggerContainer")
addMenuentry(submenucontainer, "ActionTrigger", 0, {"Text": "Content2", "CommandURL": ".uno:HelpIndex", "HelpURL": "5401"})
addMenuentry(submenucontainer, "ActionTrigger", 1, {"Text": "Tips2", "CommandURL": ".uno:HelpTip", "HelpURL": "5404"})
addMenuentry(contextmenu, "ActionTrigger", 0, {"Text": "Help2", "CommandURL": ".uno:HelpMenu", "HelpURL": "5410", "SubContainer": submenucontainer})
addMenuentry(contextmenu, "ActionTriggerSeparator", 1, {"SeparatorType": ActionTriggerSeparatorType.LINE})
return CONTINUE_MODIFIED # EXECUTE_MODIFIED, IGNORED, CANCELLED, CONTINUE_MODIFIED
def addMenuentry(menucontainer, menutype, i, props): # i: index, propsは辞書。menutypeはActionTriggerかActionTriggerSeparator。
menuentry = menucontainer.createInstance("com.sun.star.ui.{}".format(menutype)) # ActionTriggerContainerからインスタンス化する。
[menuentry.setPropertyValue(key, val) for key, val in props.items()] #setPropertyValuesでは設定できない。エラーも出ない。
menucontainer.insertByIndex(i, menuentry) # submenucontainer[i]やsubmenucontainer[i:i]は不可。挿入以降のメニューコンテナの項目のインデックスは1増える。
g_exportedScripts = macro, #マクロセレクターに限定表示させる関数をタプルで指定。
contextmenuinterceptorとcontextmenuinterceptor2を、それぞれこの順でCalcのコントローラに登録しています。registerContextMenuInterceptor()メソッドで登録したContextMenuInterceptorはinterceptorチェーンの先頭に追加されます。
contextmenuinterceptor→contextmenuinterceptor2という順に登録したので、後に登録したcontextmenuinterceptor2から呼び出されます。
デフォルトのコンテクストメニューは常に先頭で呼ばれるようようなので、デフォルトコンテクストメニュー→contextmenuinterceptor2→contextmenuinterceptor、という順で呼び出されます。
contextmenuinterceptorとcontextmenuinterceptor2は同じインデックスとコンテクストメニューに挿入しているので、contextmenuinterceptor2で挿入したインデックスはcontextmenuinterceptorの挿入でインデックスがずれることになります。
ということで右クリックすると登録した順に表示されます。
CONTINUE_MODIFIEDにしておくと、マクロを実行するたびにコンテクストメニューの項目の表示が追加されていくので、最後に呼び出されるContextMenuInterceptorのメソッドではEXECUTE_MODIFIEDを返すようにしておきます。
EXECUTE_MODIFIED
コンテクストメニューを変更したあと次のContextMenuInterceptorを呼び出さないようにします。
上のマクロではデフォルトコンテクストメニュー→contextmenuinterceptor2→contextmenuinterceptorという順に呼び出されるのでcontextmenuinterceptor2の戻り値をEXECUTE_MODIFIEDにしてみます。
Help2しか表示されなくなりました。
contextmenuinterceptorは最後に呼び出されるものなので、EXECUTE_MODIFIEDでもCONTINUE_MODIFIEDでも結果は変わりません。


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