Eclipseのプラグイン開発のテキストエディターについて。
|
|
Eclipseプラグインでは、テキストエディターのクラス(TextEditor)が用意されている。
TextEditorの描画部分にはJFaceが使われている。
Eclipse3.7では、TextEditorの使用例として、XMLエディターを作るテンプレート「Plug-in with an editor」が用意されている。
「Plug-in with an editor」テンプレートを利用すると、以下の様なプロジェクトが作られる。
<?xml version="1.0" encoding="UTF-8"?>
<?eclipse version="3.4"?>
<plugin>
<extension
point="org.eclipse.ui.editors">
<editor
name="サンプル XML エディター"
extensions="xml"
icon="icons/sample.gif"
contributorClass="org.eclipse.ui.texteditor.BasicTextEditorActionContributor"
class="exampleeditorplugin.editors.XMLEditor"
id="exampleeditorplugin.editors.XMLEditor">
</editor>
</extension>
</plugin>
例として、Asakusa FrameworkのDMDLのエディターを作ってみたい。
/* アイテム */
item = {
code : LONG;
id : TEXT;
name : TEXT;
};
まずはXMLエディターのテンプレートでプラグインプロジェクトを作成する。
DMDLエディター用のソースは0から作成し、必要なものをXMLエディターからコピーしてくる方針とする。
(最終的にはXMLエディターのソースは削除する)
プロジェクトを作ったら、最初にplugin.xmlをDMDLエディター用に修正する。
<?xml version="1.0" encoding="UTF-8"?>
<?eclipse version="3.4"?>
<plugin>
<extension
point="org.eclipse.ui.editors">
<editor
name="Asakusa Framework DMDL エディター"
extensions="dmdl"
icon="icons/sample.gif"
contributorClass="org.eclipse.ui.texteditor.BasicTextEditorActionContributor"
class="jp.hishidama.eclipse_plugin.dmdl_editor.editors.DMDLEditor"
id="dmdl_editor.editors.DMDLEditor">
</editor>
</extension>
</plugin>
エディターの名前とかファイルの拡張子とかクラス名とかIDを付ける。
(アイコンはとりあえず後回し(笑))
次に、plugin.xmlで指定したエディタークラスを作成する。(参考:XMLEditor.java)
package jp.hishidama.eclipse_plugin.dmdl_editor.editors; import org.eclipse.ui.editors.text.TextEditor;
public class DMDLEditor extends TextEditor {
/**
* コンストラクター.
*/
public DMDLEditor() {
}
@Override
public void dispose() {
super.dispose();
}
}
中身は全く何も記述していないが、TextEditorクラスでデフォルトの実装がされているので、もう使える。
Eclipseプラグインをテスト実行して開くEclipse上で拡張子dmdlのファイルを作って開くと、このエディタークラスが実行されている。
エディターをリフレッシュ(データを再解釈)する方法。
TextEditorのhandleEditorInputChangedを呼び出すと、データをリフレッシュできる。
ただしエディター内のデータとファイルの内容が一致していないと、一致させるかどうかの確認ダイアログが出る。
これを確認せずリフレッシュしたい場合は以下のようにすればよい。
public void refresh() {
IDocumentProvider provider = getDocumentProvider();
IDocumentProviderExtension extension = (IDocumentProviderExtension) provider;
try {
extension.synchronize(getEditorInput());
} catch (CoreException e) {
e.printStackTrace();
}
//以下、アウトラインページやフォールディングの更新
}
参考: stackoverflowのEclipse : Update Editor