LibreOffice5(140)ノンモダルダイアログとモダルダイアログを閉じるときの違い

2018-01-29

旧ブログ

t f B! P L
LibreOffice5(139)リスナーのメソッドの発火ログを取得するgridcontrolLog.odsを使ってノンモダルダイアログとモダルダイアログの違いをみてみます。

前の関連記事:LibreOffice5(139)リスナーのメソッドの発火ログを取得する


モダルなコントロールダイアログに追加したリスナーの発火



2行目までがダイアログを開いたときのログです。

TopWindowListenerのwindowOpened()メソッドに続いてwindowActivated()メソッドが発火しています。

ダイアログを閉じるときはTopWindowListenerのwindowClosed()メソッドに続いてdisposing()メソッドが発火しています。

さらにダイアログ上のコントロールに追加したリスナーのdisposing()メソッドも発火しています。

ダイアログ上のCloseボタンではなくウィンドウの閉じるボタンをクリックしても同じ結果でした。

TopWindowListenerのwindowClosing()メソッドが発火しないのはドキュメントを閉じるとき同じです(Calc(55)追加できるリスナー一覧: その7)。

windowClosing()メソッドが発火しない点を除けばモダルダイアログに追加したリスナーの挙動は期待した通りです。

ノンモダルなコントロールダイアログに追加したリスナーの発火



5行目までがノンモダルダイアログを開いたときのログです。

モダルダイアログと違ってウィンドウがフレームに入っているのでフレームのリスナーも発火します。

TopWindowListenerのwindowOpened()メソッドがまず発火し次にwindowActivated()メソッド、その次はFrameActionListenerのFRAME_ACTIVATEDFRAME_UI_ACTIVATEDが発火して最後に再度TopWindowListenerのwindowActivated()メソッドが発火しました。

ノンモダルウィンドウが閉じるときはまずTopWindowListenerのwindowClosing()が発火して、FrameActionListenerのFRAME_UI_DEACTIVATEDが発火して、再度TopWindowListenerのwindowClosing()が発火した後、CloseListenerのqueryClosing()メソッド、notifyClosing()メソッドが発火し、最後にTopWindowListenerのwindowClosed()メソッドが2回発火しています。

TopWindowListenerのメソッドはwindowOpened()メソッド以外は2回ずつ発火するので使いにくいですね。

コントロールダイアログをフレームに追加するときに二重にTopWindowListenerが追加されたせいではないかと思いましたが、フレームからコンテナウィンドウを取得してそれにTopWindowListenerを追加しても発火しませんでした。

またFRAME_UI_DEACTIVATEDはノンモダルダイアログの生涯で1回しか発火しませんので、ダイアログを閉じるときに必ず発火するわけではありません。

ウィンドウをドラッグした時のTopWindowListenerの発火


ウィンドウをドラッグしたときのTopWindowListenerの反応はlinuxBean14.04とWindows10とでは異なりました。

linuxBean14.04ではウィンドウタイトルをドラッグするとそのたびにTopWindowListenerのwindowDeactivated()とwindowActivated()が発火しました。

それに対して、Windows10ではウィンドウをドラッグしてもTopWindowListenerのメソッドは発火しませんでした。

モダルダイアログでもノンモダルダイアログでも同様の結果でした。

ノンモダルなコントロールダイアログを非アクティブにしたとき発火するリスナー


ノンモダルダイアログはダイアログを表示したままドキュメントウィンドウをアクティブにできます。


ノンモダルなコントロールダイアログを表示させたままCalcドキュメントのウィンドウをアクティブにしたときの結果です。

TopWindowListenerのメソッドが2回ずつ発火していることがわかります。

このリスナーは上に書いたようにlinuxBean14.04ではウィンドウをドラッグしただけでも発火するのでちょっと使いにくいです。

FrameActionListenerのFRAME_UI_DEACTIVATEDも発火していますが、このリスナーが発火するのはウィンドウがアクティブでなくなったときの最初の1回だけです。

1回発火した後は、コントールダイアログをアクティブにした後でもウィンドウを閉じるときもFRAME_UI_DEACTIVATEDは発火しませんでした。

なので、FRAME_UI_DEACTIVATEDは最初に非アクティブにしたときだけの処理にしか使えません。

コントロールダイアログにはXFocusListenerを追加できるのでFocusListenerをコントロールダイアログに追加してみましたが、全く発火しませんでした(フレームから取得したコンテナウィンドウに追加しても同じ結果)。

FocusListenerが発火する条件は定数FocusChangeReasonであることから考えるとこれはウィンドウのフォーカスではなくダイアログ上のコントロールのフォーカスを指しているようです。

他にノンモダルなコントロールダイアログを非アクティブにしたとき発火する適当なリスナーは思いつきませんでした。

ノンモダルダイアログに追加したリスナーを削除するタイミング


ドキュメントではドキュメントに追加したDocumentEventListenerのOnUnloadでリスナーを削除しました(Calc(55)追加できるリスナー一覧: その7)。

ノンモダルダイアログではダイアログに追加したTopWindowListenerは複数回同じメソッドが発火するので使えないので、フレームに追加したCloseListenerのqueryClosing()メソッドでリスナーを除去することにしました。

次の関連記事:LibreOffice5(141)ツールキットのサービスとインターフェイスの一覧

ブログ検索 by Blogger

Translate

最近のコメント

Created by Calendar Gadget

QooQ