tips/eclipse/plugin開発/org.eclipse.ui.editors 拡張/02 EditorPart の生成で「サイトが異なっています」 のバックアップの現在との差分(No.1)


  • 追加された行はこの色です。
  • 削除された行はこの色です。
#navi(../../)

* org.eclipse.ui.editors 拡張 : EditorPart の生成で「サイトが異なっています」 [#eeec01ff]


前述の editor プラグインがメニューに表示されない件を解決して、
前述の editor プラグインがメニューに表示されない件

[[tips/eclipse/plugin開発/org.eclipse.ui.editors 拡張/01 ポップアップメニューの「開く」に表示されない]]

を解決して、
実際に選択できるようになったものの、
今度は Exception が発生してしまいました。~
(日本語版なので)「サイトが異なっています」というメッセージなのですが、
何が原因なのか、まるで分からないです。

最低限の情報としてスタックトレースが表示されていて、
それによると org.eclipse.ui.internal.EditorManager#createSite 内で
Exception が発生している模様。
Eclipse のソースの中からクラスを探し出し
(internal なクラスのソースを見なくてはならないなんて!!)、
createSite 周辺のソースを読むと、
どうもこのメソッド内で生成した EditorSite インスタンスと、
createSite の引数となっている IEditorPart
(おそらくプラグイン拡張を実装した EditorPart)の
getSite もしくは getEditorSite と比較して、
異なっていると Exception としているようです。

生成した直後に他のオブジェクト(IEditorPart)のメンバーと比較?
と疑問に思ってよく見てみると、
比較の直前に IEditorPart#init(IEditorSite, IEditorInput) を呼んでいる。~
どうも IEditorSite を実装したクラスの init に IEditorSite を渡すので、
自分で保持しておけ、ということのようです。

そこまで判明したので、
EditorPart を継承したプラグイン拡張の雛形クラスの init で、
親クラスの init(super.init)を呼べばよいかと思ったのですが。。。~
EditorPart#init は抽象メソッドとのこと。
雛形のクラスなんだから、最低限の実装はしていてくれればよいのに!
しかもどう実装すればよいか明確な説明がない。。。
(少なくともヘルプやチュートリアルには)。

どうにか EditorPart.java を Eclipse のソースの中から探し出し、
init メソッドを見てみると、確かに抽象クラス。
しかもそのコメントには、「このように実装するのがよい」などと書いてあります。

どうにかコメントに書かれていたとおり記述すると、
ようやくエディターの UI が表示されるように。~
長い道のりだった。。。~
ソースを読まないと起動すらできないとは。~
世間の人は普通にソースを読んで、普通にこんな問題はクリアしているのか?