セル上でマウスをダブルクリックする前回のイヴェントの作例ではマウスのイベントの監視はLibreOffice側で行うようになっていた。今回はそこの部分もマクロで行うようにした。
マウスのボタンが押された・放されたというイヴェントは親クラスXMouseClickHandlerを使う。このクラスにはmousePressedとmouseReleasedメソッドが定義されているのでこれを再定義して使う。
作例の意図は「セル上でマウスの左ボタンをダブルクリックするとそのセルの背景色は赤になる」である。
【マクロ】
#coding: utf-8
import uno
import screen_io as ui
import unohelper
from com.sun.star.awt import XMouseClickHandler
from com.sun.star.awt import MouseButton
class MouseClickHandler(unohelper.Base, XMouseClickHandler):
def __init__(self, subj, doc, sheet):
self.subj = subj
self.args = doc, sheet
def mousePressed(self, mouseevent):
doc, sheet = self.args
if mouseevent.Buttons==MouseButton.LEFT:
if mouseevent.ClickCount==2: #
target = doc.getCurrentSelection()
if target.supportsService("com.sun.star.sheet.SheetCell"):
address = target.getCellAddress()
Row = address.Row
Column = address.Column
#msg = str(Row) + ' ' + str(Column)
#ui.Print(msg)
cell = sheet.getCellByPosition(Column, Row)
cell.CellBackColor = 0xff0000
return False
def mouseReleased(self, mouseevent):
return False
def createDialog():
#ダイアログの登録
ctx = XSCRIPTCONTEXT.getComponentContext()
smgr = ctx.getServiceManager()
dp = smgr.createInstanceWithContext("com.sun.star.awt.DialogProvider", ctx)
#シートの登録
doc = XSCRIPTCONTEXT.getDocument()
ctrl = doc.getCurrentController()
sheet = doc.Sheets[0]
#エヴェント監視
mouseclickhandler = MouseClickHandler(ctrl, doc, sheet)
ctrl.addMouseClickHandler(mouseclickhandler) # EnhancedMouseClickHandler
「左マウスのダブルクリックか」や「マウスがセル上にあるか」の判定は再定義したmousePressedメソッドの先頭で行っている。このマクロはCalcが起動しシート画面が出た時点で起動できる(プルダウンメニュ「ツール」->「カスタマイズ」と行き、イヴェント一覧から「文書を開いたとき」を選び当該マクロとを繋ぐ)。
なお、この作例を作るにあたってはここが参考になった。