あるファイルがエディタで開かれているかを取得する方法
今回は,あるファイルが何らかのエディタで開かれているかどうかを取得する方法を紹介する。
早速コードを下記に示す。
IFile targetFile = ...; // 対象のファイルのハンドル
IEditorInput input = new FileEditorInput(targetFile);
IWorkbench workbench = PlatformUI.getWorkbench();
IWorkbenchWindow[] windows = workbench.getWorkbenchWindows();
for (int i = 0; i < windows.length; i++) {
IWorkbenchPage[] pages = windows[i].getPages();
for (int j = 0; j < pages.length; j++) {
IEditorPart editor = pages[j].findEditor(input);
if (editor != null) {
// エディタで開かれている
return true;
}
}
}
// エディタで開かれていない
return false;
Eclipseのエディタは編集対象をIEditorInputオブジェクトで扱うため,まずは対象のファイルのハンドルを元にFileEditorInputクラスのインスタンスを生成する。この入力オブジェクトがエディタを探すためのキーとなる。
あるエディタを探し出すために,EclipseのUI構成を辿る処理を行う。Eclipseでは,
「ワークベンチ → ワークベンチウィンドウ → ワークベンチページ → エディタパート」
というコンポジット構造になっている。これをプログラム上でぐるぐる回して,該当するエディタを探し出す。
まずワークベンチ(IWorkbench)オブジェクトをPlatformUIクラスのgetWorkbenchクラスメソッドを呼び出して取得する。ここが基点。ワークベンチは複数のワークベンチウィンドウにより視覚化されるため,次はワークベンチからワークベンチウィンドウ(IWorkbenchWindow)オブジェクトの配列をgetWorkbenchWindowsメソッドを用いて取得する。各ワークベンチウィンドウはいくつかのワークベンチパートを持っているため,さらにワークベンチウィンドウからワークベンチパート(IWorkbenchPart)オブジェクトの配列をgetPagesメソッドを用いて取得する。
IWorkbenchPartインタフェースには,入力オブジェクトに対応するエディタを探してくれるfindEditorメソッドが用意されている。各ワークベンチパートオブジェクトに対して,findEditorメソッドに最初に生成したIEditorInputオブジェクトを渡して,IEditorPartオブジェクトを取得する。この際,指定した入力オブジェクトを入力とするエディタが存在すればIEditorPartオブジェクトが返却され,もし存在しなければnullが返却される。
つまりコンポジット構造の走査中に,findEditorメソッドの戻り値としてIEditorPartオブジェクトが得られれば対象のファイルがエディタで開かれていることになり,findEditorメソッドの全呼び出しがnullになってfor文を抜けてしまった場合は対象のファイルはエディタで開かれていない,ということになる。
| 固定リンク
この記事へのコメントは終了しました。
コメント