3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

個人的に手こずったEclipseプラグインのビュー開発Tips

Last updated at Posted at 2018-12-24

この記事は高知工科大学 Advent Calendar 2018の24日目の記事です.
クリスマスイブです.みなさんはいかがお過ごしでしょうか.私はこれ書いてます.
jsわからなかったので,最近なぜか触っているEclipseのプラグイン開発のTip的なやつ書きます.世に需要のあらんことを.

はじめに

なんやかんやでEclipseのプラグインを開発しています.その際,実現したい機能の実装方法がなかなかわからず辛かったので,同じように苦しんでいる人の助けになればと思った次第です.
この記事ではEclipseのプラグインの中でも,ビューの開発について書きます(他は知らない).

お品書き

環境

  • Mac
  • Eclipse2018-09 Mac 64bit Ultimate(日本語化されたやつ
  • JavaSE - 1.8
  • plugin.xmlのeclipse version : 3.4
  • フレームワーク : SWT

Tips

ファイルを独自のエディタで開く

IDE.openEditorを使うことで任意のファイルを開くことができます.この時,ファイルを開くエディタは,プラグインを使う側のEclipseの設定に依存するようです.つまり,設定されていなかったり,設定が変わっていたりすると,どのエディタで開かれるかわかりません.開くエディタを設定するには,例えば次のようにエディタのIDを引数に渡してやります.
エディタのIDは,自作エディタの場合は<editor>タグで指定したIDです.

IWorkbench workbench = PlatformUI.getWorkbench();
IWorkbenchWindow window = workbench.getActiveWorkbenchWindow();
IWorkbenchPage page = window.getActivePage();
IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
IFile file  = root.getFile(/* File path */);
IEditorInput ie = new FileEditorInput(file);
try {
  IDE.openEditor(page, ie, /* Editor Id */);
} catch (PartInitException e) {
  e.printStackTrace();
}

マーカーを使ってエディタの指定範囲をハイライトする

エディタの指定範囲をハイライトするのに,マーカーを利用できます.マーカーのCHAR_STARTCHAR_ENDを設定することでCHAR_STARTからCHAR_ENDまでをハイライトできます.次の例は,任意の行をハイライトする例です.ハイライトする色は,マーカー自体の設定ではなく,org.eclipse.ui.editors.markerAnnotationSpecificationを拡張して,colorPreferenceValue属性で設定します.
マーカーの拡張がorg.eclipse.core.resources.markersで,その設定をするのがorg.eclipse.ui.editors.annotationTypesで,さらにその詳細を設定するのがorg.eclipse.ui.editors.markerAnnotationSpecificationなので注意(めんどい).

IWorkbench workbench = PlatformUI.getWorkbench();
IWorkbenchWindow window = workbench.getActiveWorkbenchWindow();
IWorkbenchPage page = window.getActivePage();
IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
IFile file  = root.getFile(/* File path */);
FileEditorInput input = new FileEditorInput(file);
FileDocumentProvider provider = new FileDocumentProvider();
try {
  provider.connect(input);
} catch (CoreException e) {
  throw new RuntimeException(e);
}
IDocument document = provider.getDocument(input);
IRegion r = null;
try {
  r = document.getLineInformation(/* Line number */); // 行の情報を取得
} catch (BadLocationException e) {
  e.printStackTrace();
}
IMarker marker = file.createMarker(/* Marker ID */);
marker.setAttribute(IMarker.CHAR_START, r.getOffset());
marker.setAttribute(IMarker.CHAR_END, r.getOffset() + r.getLength());

別のビューに情報を渡す

別のビューの情報を渡すには,そのビューに専用の関数を用意してやればよいです.次のコードのように,workbenchPage.showViewで開いているビューを探せるので,関数(コード中のhoge,任意に実装してね)を実行することで情報を渡せます.

IWorkbench workbench = PlatformUI.getWorkbench();
IWorkbenchPage workbenchPage =
  workbench.getActiveWorkbenchWindow().getActivePage();
try {
  /* View Class */ view =
    (/* View Class */) workbenchPage.showView(/* View ID */);
  view.hoge(/* 情報 */);
} catch (PartInitException e) {
}

エクスポートしたプラグインを他のEclipseで読み込む際の注意

作成したプラグインをjarファイルにエクスポートすることで,Eclipseで読み込んで利用できます.ただし,読み込むにもEclipse Plug-in Development Environmentが必要です.インストールされているかどうかの確認や,インストール自体は,メニューバーからHelp -> Install New Software の順に開き,使っているEclipse用のリポジトリ(Eclipse2018-09なら2018-09 - http://download.eclipse.org/releases/2018-09)からできます.
それから,jarファイルを配置する場所ですが,Eclipseのバージョン(?)によってはContents/Eclipse/pluginの下でも読み込んでくれるようですが,公式からダウンロードしたEclipse2018-09のEclipse IDE for Java DevelopersではContents/Eclipse/dropinsの下でないと読み込んでくれませんでした.

おわりに

需要があっても役に立つかどうかわからない記事ですが,億が一にでも誰かの助けになれれば幸いです.jsわかんないから仕方ない(仕方なくない).ちょっと開発から間が空いて忘れてることあるかもなので,何か思い出したら追記するかも.

それではみなさまメリークリスマス,私は周回に戻ります.

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?