tips/eclipse/plugin開発/org.eclipse.ui.editors 拡張/02 EditorPart の生成で「サイトが異なっています」
org.eclipse.ui.editors 拡張 : EditorPart の生成で「サイトが異なっています」 †
前述の 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 が表示されるように。
長い道のりだった。。。
ソースを読まないと起動すらできないとは。
世間の人は普通にソースを読んで、普通にこんな問題はクリアしているのか?