JAR ファイルを作る その 2
というわけで、objectContribution に filter を追加してみました。
必須のアトリビュートは name と value。というかアトリビュートはこれしかないんですけどね。Tomcat Plug-in だと name が project Nature。って、ナンの意味なんでしょ?
まぁ、いいや。とりあえず実行。でも、やっぱり何もあらわれません。
やっぱり、action がないとダメなのでしょうか。
で、作ってみました。
分からなかったのが、class。とりあえず、適当に作ってみました。
さて、実行。
おぉ、ちゃんとメニューが表示されました。
ところが、[Create JAR File] を選択してみると...
Could not create action delegate for id: jp.gr.java_conf.lg3d.wrpe.action.createJar Reason: Action must implement IActionDelegate
そんなこと知らなかったよ。
で、Javadoc を見てみると、アクションの基本となるのが IActionDelegate で、用途に応じてこの派生インタフェースを使うようです。試しに Tomcat Plug-in を見てみたら IWorkbenchWindowActionDelegate インタフェースを使用していました。
ということで、IWorkbenchWindowActionDelegate インタフェースをインプリメントするようにアクションクラスを変更。
public class CreateJarActionDelegate implements IWorkbenchWindowActionDelegate { public CreateJarActionDelegate() { super(); // TODO Auto-generated constructor stub } public void dispose() { // TODO Auto-generated method stub } public void init(IWorkbenchWindow window) { // TODO Auto-generated method stub } public void run(IAction action) { // TODO Auto-generated method stub } public void selectionChanged(IAction action, ISelection selection) { // TODO Auto-generated method stub } }
ちなみに plugin.xml の該当部は次のようになっています。
<extension point="org.eclipse.ui.popupMenus"> <objectContribution adaptable="true" id="jp.gr.java_conf.lg3d.wrpe.action.popup.javaProject" objectClass="org.eclipse.core.resources.IProject"> <menu id="jp.gr.java_conf.lg3d.wrpe.action.popup.javaProject.menu" label="Project Looking Glass" path="additions"> <separator name="group"/> </menu> <action class="jp.gr.java_conf.skrb.lg3d.wrpe.action.CreateJarActionDelegate" id="jp.gr.java_conf.lg3d.wrpe.action.createJar" label="Create JAR File" menubarPath="jp.gr.java_conf.lg3d.wrpe.action.popup.javaProject.menu/group"/> </objectContribution> </extension>
実行して、先ほどと同じように [Create JAR File] を選択。でも、何も起きません。当たり前か、何も実装していないのだから。でも、エラーは出ませんでした。
中身はこれから実装していけばいいとして、もう 1 つ不具合を見つけてしまいました。今のままだと、どんなプロジェクトでも [Project Looking Glass] というメニュー項目が表示されてしまうのです。
メニューの対象となっているのが、org.eclipse.core.resources.IProject インタフェースとだけになっているので、こうなっているのでしょう。
LG3D Project で作成したものだけにしたいのですが、そのためには何らかのフィルターが必要です。でも、どうやってフィルタリングすればいいのか。
それは置いておいて、とりあえず中身を実装することからはじめましょう。