Pythonでマクロ(10):マウスのイヴェントを処理する

セル上でマウスをダブルクリックする前回のイヴェントの作例ではマウスのイベントの監視は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が起動しシート画面が出た時点で起動できる(プルダウンメニュ「ツール」->「カスタマイズ」と行き、イヴェント一覧から「文書を開いたとき」を選び当該マクロとを繋ぐ)。

なお、この作例を作るにあたってはここが参考になった。