Calc(59)追加できるリスナー一覧: その10 実行結果の整理

2018-01-07

旧ブログ

t f B! P L
Calc(51)追加できるリスナー一覧: その3のリスナーのリストについてCalc(55)追加できるリスナー一覧: その7で作成したマクロの実行結果をまとめます。

前の関連記事:Calc(58)追加できるリスナー一覧: その9


デスクトップに追加するリスナー


XTerminateListener

ファイル→LibreOfficeの終了、でqueryTermination()メソッドに続いてnotifyTermination()メソッドが発火します。

linuxBean14.04ではこのリスナーはちゃんと削除しないとLibreOfficeのプロセスが残ったままになって、それを終了させないとLibreOfficeを起動できなくなりました(Calc(49)追加できるリスナー一覧: その1)。

Windows10ではとくに表立っては問題は起きませんでした。

XFrameActionListener

デスクトップに追加したこのリスナーのメソッドが発火する機会は見つけられませんでした。

フレームに追加するリスナー


XFrameActionListener

enum FrameActionにある8つのいずれかのイベントが発生するとframeAction()メソッドが発火します。

どのイベントで発火したのかはframeAction()メソッドの引数のFrameActionEvent StructのActionアトリビュートにenum FrameActionが入っているのでそれで鑑別します。

COMPONENT_ATTACHEDFRAME_ACTIVATEDはそれが発生する前にフレームを取得する方法がわからなかったので、発火の確認はできませんでした。

COMPONENT_DETACHINGが発火する条件はわかりにくいものでした。

ドキュメント一つ開いている状態で、ファイル→閉じる(またはウィンドウの閉じるボタンで閉じる)、でスタートセンターに切り替わるときや、ファイル→LibreOfficeの終了、でLibreOfficeを終了するときは発火しました(Calc(55)追加できるリスナー一覧: その7)。

しかしドキュメントを複数開いている状態で、ファイル→閉じる(またはウィンドウの閉じるボタンで閉じる)、でフレームを閉じたときは発火しませんでした(Calc(58)追加できるリスナー一覧: その9)。

COMPONENT_REATTACHEDはドキュメントを閉じてスタートセンターに切り替わる時に発火しました(Calc(55)追加できるリスナー一覧: その7)。

FRAME_DEACTIVATINGCONTEXT_CHANGEDは発火する条件は見つかられませんでした。

FRAME_UI_DEACTIVATINGはすでに開いているドキュメントから新規ドキュメントを開いた時に発火しました、、、たった1回だけ、、、以後は同様に新規ドキュメントを作成しても発火しませんでした(Calc(58)追加できるリスナー一覧: その9)。

FRAME_UI_ACTIVATEDはFRAME_UI_DEACTIVATINGと対になっているのかと思いましたが、発火する条件はみつけられませんでした。

XCloseListener

queryClosing()メソッドはフレームを閉じるときに発火します。

第2引数のgetsownershipにはFalseが入っていました。

スタートセンターに切り替わるときはフレームは閉じないので発火しません(Calc(55)追加できるリスナー一覧: その7)。

notifyClosing()メソッドはフレームが閉じたときに発火します。

XTitleChangeListener

ウィンドウタイトルはフレームタイトルのこと(LibreOffice5(33)モードレスダイアログの例をPythonに翻訳する:その1LibreOffice5(72)Javaの例:GUIをPythonにする その5)なので、ウィンドウタイトル(通常はドキュメント名)が変化したときにtitleChanged()メソッドが発火します。

引数のTitleChangedEvent StructのTitleアトリビュートに変化後のタイトルが入っています。

コンテナウィンドウに追加するリスナー


フレームはコンテナウィンドウとコンポーネントウィンドウをもっていますが、コンテナウィンドウになれるのはXTopWindowListenerをもっているのはウィンドウだけです(LibreOffice(32)デベロッパーガイド4:コンポーネントフレームワーク)。

XTopWindowListener

windowActivated()メソッドはウィンドウをアクティブにしたとき、windowDeactivated()メソッドはウィンドウがアクティブでなくなったときに発火しました。

コンテナウィンドウはフレームと同じ寿命のようで、コンテナウィンドウのwindowClosed()メソッドは、フレームのnotifyClosing()メソッドの次に発火していました(Calc(55)追加できるリスナー一覧: その7)。

しかしなぜか2回発火します。

windowClosing()メソッドはウィンドウを閉じるときに発火するはずですが、ファイル→閉じる、では発火せず、ウィンドウの閉じるボタンで閉じたときだけ発火しました(Calc(58)追加できるリスナー一覧: その9)。

windowMinimized()メソッドはウィンドウを最小化したとき、windowNormalized()メソッドは最小化を解除したときに発火しました。

windowOpened()メソッドは発火する前にコンテナウィンドウを取得する方法がわからなかったので動作確認できませんでした。

XTopWindowListener以外にコンポーネントウィンドウと同じリスナーが複数あります。

XWindowListenerXMouseMotionListenerXPaintListenerXDockableWindowListenerXVclContainerListenerといったリスナーはここに他に挙げたオブジェクトにないリスナーです。

コントローラーに追加するリスナー


XActivationEventListener

activeSpreadsheetChanged()メソッドはアクティブなシートが変化したときに発火します(Calc(54)追加できるリスナー一覧: その6)、、、

しかし新規シートを挿入したときは挿入前のシートで一旦発火していました(Calc(58)追加できるリスナー一覧: その9)。

引数のActivationEvent StructのActiveSheetアトリビュートにはアクティブなシートが入っています。

Sourceアトリビュートにはコントローラーが入っています。

XEnhancedMouseClickHandler

これはリスナーではなくハンドラなのでTrueかFalseを返さないといけません(Calc(27)ドキュメント内のすべてのシートでクリックを補足する)。

マウスボタンを押したときにmousePressed()メソッド、ボタンを離したときにmouseReleased()メソッドが発火します。

左ボタンをダブルクリックしたときはクリックした回数分それぞれ発火します。

右ボタンをクリックしたときはmousePressed()メソッドだけが発火しました(Calc(54)追加できるリスナー一覧: その6)。

引数のEnhancedMouseEvent StructのTargetには常にセルが入っていました。

複数セルを選択した状態で右クリックしたときもクリックしたセルが入っています。

行や列全体を選択した時は範囲の先頭のセルが入っていました(Calc(54)追加できるリスナー一覧: その6)。

Buttonsアトリビュートには定数MouseButtonが入っており押したボタンの種類が取得できます。

ClickCountアトリビュートには連続クリック数が入っています。

PopupTriggerアトリビュートはセルをクリックしたときは常にFalseでした。

Modifiersアトリビュートはクリックしたときに押している修飾キーに対応した定数KeyModifierが入っています。

修飾キーを押していない時は0が入っていました。

コントローラーが入っていると思ったSourceは意外にもNoneでした。

XSelectionChangeListener

コントローラーのXSelectionSupplierのgetSelection()メソッドで取得できるオブジェクトが変化したときにselectionChanged()メソッドが発火します。

オブジェクトを選択したときではなく、getSelection()メソッドで取得できるオブジェクトが変化したときに発火するのでシートが変わっても発火します。

selectionChanged()メソッドの引数にはコントローラーが入っているので、そのコントローラーのgetSelection()メソッドから選択が変わった後のオブジェクトが取得できます。

ドキュメントのXModelのgetCurrentSelection()メソッドでも同じオブジェクトが取得できるようです(Controllers - Apache OpenOffice Wiki)。

APIリファレンスをみるとgetSelection()メソッドの戻り値がAnyに対してgetCurrentSelection()メソッド戻り値の型はXInterfaceになっています。

このselectionChanged()メソッドはやたら複数回発火します(Calc(54)追加できるリスナー一覧: その6)。

新規シートを挿入したときはgetSelection()メソッドで取得できるオブジェクトが新規シートのセルになってからまた既存シートのセルに変わるので注意が必要です(Calc(58)追加できるリスナー一覧: その9)。

Sourceはコントローラーが入っていました。

マウスでセルを選択したときも発火するのですが、矢印キーでセルを変更したときと比べると反応がワンテンポ遅いです(linuxBean14.04のLibreOffice5.4の場合)。

XBorderResizeListener

Calc(53)追加できるリスナー一覧: その5でやったようにborderWidthsChanged()メソッドが発火するのですが、いまのところこのリスナーの使いどころはわかりません。

XTitleChangeListener

コントローラーに追加したtitleChanged()が発火する条件はわかりませんでした。

XKeyHandler

キーを押すとkeyPressed()メソッド、キーを離すとkeyReleased()メソッドが発火します。

これはハンドラなのでTrueかFalseを返す必要があります。

Trueを返した場合は続くハンドラのメソッドが発火しなくなると書いてありますが、Calc(55)追加できるリスナー一覧: その7のマクロの戻り値をFalseからTrueに変化しても違いがわかりませんでした。

日本語入力のときはkeyPressed()メソッドは発火せず、keyReleased()メソッドしか発火しませんでした。

keyReleased()メソッドは発火するのですが、日本語の文字は取得できませんでした(Calc(56)追加できるリスナー一覧: その8)。

ドキュメントに追加するリスナー


XDocumentEventListener 

ドキュメントにイベントが発生するとdocumentEventOccured()メソッドが発生します。

発生したイベントが何であるかは、documentEventOccured()メソッドの引数のDocumentEvent StructのEventNameアトリビュートで取得できます。

発生するイベント一覧はLibreOffice5(115)イベントが呼ばれる順を調べるマクロに書いたものと一致すると思いますが、必ずしも名前通りには発生しないようです。

OnStartAppOnCloseAppOnCreateOnNewOnLoadFinishedOnLoadOnViewCreated、はそのイベントが発生する前にドキュメントを取得してリスナーを追加するのは難しそうです。

編集したドキュメントを保存するときは、OnSaveOnTitleChangedOnModifyChangedOnStorageChanged→OnTitleChanged→OnModeChangedOnSaveDone、の順に発火しました。

ファイル→名前を付けて保存、では、OnSaveとOnSaveDoneに代わってOnSaveAsOnSaveAsDoneが発火します。

ファイル→コピーを保存、ではOnCopyToOnCopyToDoneが発火しますが、OnTitleChanged、OnModifyChanged、OnStorageChanged、OnModeChangedは発火しません。

「コピーを保存」では開いているドキュメントではなく、開いているドキュメントのディスク上のデータをコピーするからです。

なので、「コピーを保存」では保存前の変化した内容は反映されません。

開いたドキュメントに初めてセルに値を入力してEnterキーで確定すると、OnTitleChanged→OnModifyChanged→OnCopyTo→OnCopyToDone、が発火します。

セルに値を入力するとディスク上からメモリ上に編集後のデータが「コピー」されるのでOnCopyToのイベントが発生するようです。

OnTitleChangedは「文書のタイトルを変更した時」に発火するはずですが、ドキュメントファイル名が変化していなくても、ドキュメントを保存するときは2回発火していますし、セルの編集後も発火しており、「文書のタイトルの変更」と関係なくOnModifyChangedとかOnModeChangedの直前に発火するようです。

新規シートを挿入したときはOnModifyChangedではなくOnModeChangedが発火している(Calc(58)追加できるリスナー一覧: その9)のでこれらの違いはよくわかりません。

しかも新規シートを挿入したときのOnModeChangedの前にはOnTitleChangedではなく、ドキュメントに追加したXTitleChangeListenerリスナーのメソッドが発火していてますます意味がわかりません。

OnTitleChanged、OnModifyChanged、OnModeChanged、OnCopyTo、OnCopyToDoneは発火する条件がよくわからないので使うのは難しそうです。

ドキュメントを閉じるときはOnPrepareViewClosingOnPrepareUnloadOnViewClosedOnUnloadOnUnfocus、の順に発火していました(Calc(55)追加できるリスナー一覧: その7)。

Calc(55)追加できるリスナー一覧: その7ではリスナーを削除するのにOnUnloadを使いました。

OnVisAreaChangedは表示しているセルが変化したときに発火しそうですが、発火は確認できませんでした。

XEventListener

これはnotifyEvent()メソッドをもつcom.sun.star.document.XEventListenerです。

disposing()メソッドをもつcom.sun.star.lang.XEventListenerとは違うので注意が必要です。

XDocumentEventListenerはこのnotifyEvent()メソッドをもつXEventListenerを継承しており、同じイベントで発火するのでこのXEventListenerを使う機会はなさそうです。

XModifyListener

ドキュメントに変化があるとmodified()メソッドが発火します。

modified()メソッドの引数に入っているEventObject Structではドキュメントが入っているだけなので、何が変化したのかは自分で探さないといけません。

ドキュメントに何らかの変化があったら発火するせいか、結構複数回発火します(Calc(56)追加できるリスナー一覧: その8Calc(58)追加できるリスナー一覧: その9)。

XPrintJobListener

印刷時に発火するリスナーです。

enumのPrintableStateのイベントが発生するとprintJobEvent()メソッドが発火します。

XStorageChangeListener

ドキュメントのストレージが変更されるとnotifyStorageChange()メソッドが発火するようですが、「ドキュメントのストレージの変更」という状況がよくわかりませんでした。

XTitleChangeListener

ドキュメントに追加したXDocumentEventListenerのdocumentEventOccured()メソッドがOnTitleChangedで発火するときはtitleChanged()メソッドも発火していました(Calc(58)追加できるリスナー一覧: その9)。

しかし、新規シートを挿入したときはXDocumentEventListenerは発火せずXTitleChangeListenerのtitleChanged()メソッドだけが発火していました。

いずれにせよドキュメントのファイル名が変化したときに発火するわけではありませんでした。

XChangesListener

XModifyListenerと違ってセルの内容やセルやドキュメントのプロパティが変化したときにchangesOccurred()メソッドが発火します(Calc(56)追加できるリスナー一覧: その8LibreOffice5(52)Javaの例:ConfigExamplesをPythonにする その5)。

引数にはChangesEvent Structが入っています。

変化したプロパティをこの引数から取得できますが、取り出し方法は少しやっかいです(Calc(56)追加できるリスナー一覧: その8)。

Sourceにはドキュメントが入っていました。

(2018.2.11追記。行や列の挿入や削除もこのリスナーで感知できます。Calc(56)追加できるリスナー一覧: その8参照。)

(2018.11.16追記。どこが変化したのかを取得でき、背景色の変更等プロパティの変化でも発火するのはメリットですが、XModifyListenerと違って、プレインテキストのペーストでは発火しないのが難点です。Calc(91)追加できるリスナー一覧: その11 変化を検知するリスナー参照。)

シート、セル、セル範囲、セル範囲コレクション、セルカーサー、行、列に追加するリスナー


XChartDataChangeEventListener

チャートに関連するデータが変化するとchartDataChanged()メソッドが発火します。

引数のChartDataChangeEvent Structから変化の種類(enum ChartDataChangeType)と変化した範囲が取得できます(未確認)。

XModifyListener

リスナーに追加したオブジェクトに変化があるとmodified()メソッドが発火します。

(2018.11.16追記。背景色の変更等プロパティの変化は、ドキュメントに追加したModifyListenerしか発火しませんでした。Calc(91)追加できるリスナー一覧: その11 変化を検知するリスナー参照。)

次の関連記事:Calc(60)セルの内容をクリップボードにコピーするマクロ

ブログ検索 by Blogger

Translate

最近のコメント

Created by Calendar Gadget

QooQ