Eclipseプラグイン開発：右クリックしたときのポップアップメニューへ自作機能追加

# 目次
[1.はじめに](#はじめに)
[2.目的](#目的)
[3.注意点](#注意点)
[4.開発環境](#開発環境)
[5.依存関係](#依存関係)
[6.拡張](#拡張)
[7.拡張要素詳細](#拡張要素詳細)
[8.終わり](#終わり)
[9.参考サイト](#参考サイト)


# はじめに
- 大学の卒業研究でEclipseのプラグインを作成した際に調べたことを書き残した記事です
- 自分と同じく研究のツールとしてプラグインを利用したい人や、自身の開発環境をよくするためにオリジナルのコマンドを作りたいという人に役立つ記事になればと思います
- 文章を読み飛ばして画像だけ見た方が直感的でわかりやすいかもしれません

# 目的
- **独自のコマンドやアクションをポップアップメニューに追加すること**


実装後の画面は以下のようになります
Qiita:Sample2をクリックすると自作の機能が使えるイメージです

![完成品.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691844/8d6871f7-7100-6dc7-c279-0c2c4afe5a6b.png)


# 注意点
- Eclipseのダウンロードやプラグインプロジェクトの作成方法については記述しません
- 参考サイトにリンクをはっておきますのでそちらをご覧ください


# 開発環境
- Windows10 Home
- Eclipse Photon
- Java 1.8
- プロジェクト名　Sample

# 依存関係
Eclipseのプラグインを開発していくには依存関係を知ることが重要です
依存関係とは自作プラグインの拡張元のプラグインのことを指します
本記事の目的はアクションの追加を行うことなので以下の依存関係を plugin.xml->依存関係 に追加します
- org.eclipse.ui


# 拡張
依存関係を追加したらプラグインの拡張を行っていきます plugin.xml->拡張
依存関係でorg.eclipse.uiを追加したのでそこから以下の3つを拡張していきます

### org.eclipse.ui.menus
- menus：右クリックを押したときのポップアップを拡張するのに必要

### org.eclipse.ui.commands
- commands：何かしらの操作（ボタン操作やショートカットキー）などによって呼びされる動作を拡張する

### org.eclipse.ui.handlers
- handlers：対応するコマンドの具体的な処理をHandlerクラスとして対応付けを行う

# 拡張要素詳細
plugin.xml->拡張タブの右側、拡張要素詳細について3つの拡張ポイントを個別に説明
### org.eclipse.ui.menus
org.eclipse.ui.menusにマウスを合わせ右クリック->新規->menuContribution
menuContributionの**locationURI**の欄に**popup:org.eclipse.ui.popup.any?after=copy**を入力、他の欄はそのまま
![最初のlocationURI.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691844/5708b8a6-bab8-d11a-4935-9434f87f2e92.png)


org.eclipse.ui.menusの後に段でpopup:org.eclipse.ui.popup.any?after=copy(menuContribution)ができるはずなので
マウスを合わせ右クリック->新規->menu を押すと**label(menu)**が生成される
label(menu)の要素詳細にある**label***:に入力した文字は右クリックしたときのコピーとか切り取りの欄に表示される文字です
ほかの欄は使いません
![menus.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691844/65b59e50-1b15-6600-4385-4ce92b9a5eb6.png)



次に、もう1つmenuContributionを生成します。新しく作ったmenuContributionのlocationURIには
popup:**先ほど作ったmunuのID**?after=additions を入力　例）popup:Sample.popuup.menu?after=additions
![2個目のlocationURI.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691844/7c912d5f-9357-e71a-3846-869474b46f00.png)


新しく作ったmenuContributionを右クリック->commandをクリックしてcommandを生成
commandIDにはorg.eclipse.ui.commandsで作るcommandのIDを入力します
label：menuで入力したlabelの後にでてくる表示名になります。目的のところで見せた実装画面のQiita.Samplse2の箇所
id：プロジェクト名.pupup.自由
![menus.command..png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691844/dfcb4b77-1089-649e-644e-1b19d5122e65.png)




### org.eclipse.ui.commands
org.eclipse.ui.commandsを右クリック->category をクリックし生成されたものに**id*:**を割り振ります
id：プロジェクト名.カテゴリー名が一般的な命名規則だそうです　例）Sample.category1
**name*:**に関しては右クリックのポップアップでは関係ないので飛ばします

次にorg.eclipse.ui.commandsを右クリック->command でcommandを生成します
id：プロジェクト名.command.自由 　　
name：自分でわかりやすいコマンド名を付けます
**categoryId:は重要です**、先で作った**categoryのIdと同じもの**を欄に記入してください
参照ボタンからcategoryIdを記入すれば入力ミスはなくなるので便利です
以下のようにcategoryIdがあっていれば大丈夫です
![commandsの上.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691844/2e476ec5-fa82-f8ff-954b-e2395e06da6a.png)

![commands.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691844/4d8586f2-fa5c-7039-9dd3-afc48d666567.png)


### org.eclipse.ui.handlers
org.eclipse.ui.handlersを右クリック->handler をクリックしhandler生成します
handlerのcommandIdには**org.eclipse.ui.commandsで作ったcommandのId**を入れます
次に**class:**をクリックしhandlerクラスを作ります
注意することは、handler専用パッケージを作りIHandlerをimplementsすることです
ボタンが押されたときの具体的な処理はexecuteメソッドに書きます
※isEnabled と isHandledメソッドのfalseは**true**に変えておかないとクリックしても反応しないので注意

![Handler.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691844/083c6a88-bdf6-12eb-bec7-57fb4eaa5765.png)


```java:SampleHandler.java
package handler;

import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.commands.IHandler;
import org.eclipse.core.commands.IHandlerListener;

public class SampleHndler implements IHandler {

	@Override
	public void addHandlerListener(IHandlerListener handlerListener) {
		// TODO 自動生成されたメソッド・スタブ
	}
	@Override
	public void dispose() {
		// TODO 自動生成されたメソッド・スタブ
	}
	@Override
	public Object execute(ExecutionEvent event) throws ExecutionException {
		// TODO 自動生成されたメソッド・スタブ
        //クリックされたときの具体的な処理を記述
		return null;
	}
	@Override
	public boolean isEnabled() {
		// TODO 自動生成されたメソッド・スタブ
		return true;
	}
	@Override
	public boolean isHandled() {
		// TODO 自動生成されたメソッド・スタブ
		return true;
	}
	@Override
	public void removeHandlerListener(IHandlerListener handlerListener) {
		// TODO 自動生成されたメソッド・スタブ
	}

}

```


# 終わり
以上で右クリックしたときに出るポップアップにコマンドを追加する方法は終わりです
初めて記事を書いたので文章がおかしいと思いますがわからないことがあったら連絡してください
反応があったらもしくは暇だったら、ツールバーへボタンを用いたアクション追加の仕方を記事にしたいと思います
ありがとうございました

# 参考サイト
- [commandやhandlerの書き方で参考になります -> 拡張：org.eclipse.ui.commands - - 開発メモ](http://developmentmemo.blog.fc2.com/blog-entry-16.html)
- [ポップアップやツールバーを拡張したい時に参考になります -> EclipseプラグインCommandサンプル](https://www.ne.jp/asahi/hishidama/home/tech/eclipse/plugin/develop/command.html)