エディタセーブ時の振る舞い。

以前も何かの折に触れた気がするんだけど、
エディタのセーブ時にセーブとセーブにまつわる処理を中断する方法について。


そもそもエディタは
IEditorPart インタフェースを実装して作成する。
そのなかでセーブ機能は doSave メソッドで実装する。


doSave メソッドは Eclipse が呼ぶ。
引数は IProgressMonitor である。
そして、doSave メソッドの説明には、


If the save is cancelled through user action, or for any other reason, the editor should invoke setCancelled on the monitor to inform the caller.
つまり、doSave メソッドでなんらかの理由で処理を中断したい場合は、
IProgressMonitor の setCancelled メソッドに true を渡してやれば良いと記述されている。


ところで具体的に doSave が呼ばれるタイミングは、

  • Ctrl + S、[File]-[Save]
  • Ctrl + Shift + S、[File]-[Save All]
  • エディタが閉じるとき
  • Eclipse を閉じるとき
  • エディタで開いてるファイルが、[Open With] - [System Editor]で開かれるとき
  • Java Perspective の時にファイルが選択されて[Refactor]-[Move]が選択されたとき


のパターンが考えられる。
#どうも
#他にパターンがある場合教えて下さい。


ところが最後の [Refactor]-[Move]が選択されたとき だけ、setCanceled(true) としても処理が中断されないで、
ファイルが Move されてしまう。
#ちなみに 2.1.1 @ Windows の話です。


[Refactor]-[Move]のときに呼ばれる
JdtMoveAction のソースを見る限り、どうやらバグのようだ。
eclipse bugs」を見ても報告がないようなので、
時間あるときに報告しておく。


あと回避方法だけど、無い。
いや、monitor のクラスを instanceof で見て、
それによって [Refactor]-[Move]から doSave が呼ばれた場合を判定して、
monitor の setCancelled を呼ばないで、
RuntimeException を投げるようにするっていう手も無くはないんだけど、
圧倒的に汚い。
Eclipse のバージョンがあがると、
このソースでは対応できないかもしれないし。