エディタを開くと、ウィンドウの下の方に
行番号や上書きモードなどの情報が表示されますよね。
ここに独自エディタ用の情報を追加してみましょう。
まずは Editor クラスと Contributor クラスを作ります。
<extension
point="org.eclipse.ui.editors">
<editor
class="sampler.SampleEditor"
contributorClass="sample.SampleEditorContributor"
extensions="xxx"
icon="icon.png"
id="sampler.SampleEditor"
name="Sample Editor">
</editor>
</extension>
こんな感じで。
次に、Contributor で以下のメソッドをオーバーライドします。
@Override
public void contributeToStatusLine(IStatusLineManager statusLineManager) {
statusField = new StatusLineContributionItem(
"categoryName", true, widthInChars);
statusLineManager.add(statusField);
// super を最初に呼ぶと、statusFieldは一番最後(右)に追加される
super.contributeToStatusLine(statusLineManager);
}
Eclipseでは、ステータスバーを複数の領域に分割して扱います。
これを管理するのが IStatusLineManager であり、
その中の一つの領域を表すのが StatusLineContributionItem となります。contributeToStatusLine() をオーバーライドして、
その中でステータスマネージャにアイテムを追加します。
StatusLineContributionItem コンストラクタの引数はそれぞれ
「カテゴリ名」「可視性」「アイテムの表示幅」となっています。
カテゴリ名は適当に決めてOKですが、InputPosition などはAbstractTextEditor で使われていますので別のにしましょう。
続いて、もう一つメソッドをオーバーライドします。
@Override
public void setActiveEditor(IEditorPart part) {
super.setActiveEditor(part);
if (part instanceof ITextEditorExtension) {
ITextEditorExtension extension = (ITextEditorExtension)part;
extension.setStatusField(statusField, "categoryName");
}
}
このメソッドは、文字通りエディタがアクティブになる度に呼び出されます。
これをうまく使えば、開いたファイルによって
登録するアイテムを変えたりといった芸当もできるはずです。
ここでは簡単の為に、常に固定のアイテムを使用することにします。
Contributor の方は以上で完了です。
続いて、Editorの方です。
ステータスバーの内容を更新する updateStatusField メソッドをオーバーライドします。
@Override
protected void updateStatusField(String category) {
super.updateStatusField(category);
if ("categoryName".equals(category)) {
IStatusField field = getStatusField(category);
field.setText(new SimpleDateFormat("yyyy/MM/dd HH:mm:ss").format(new Date()));
}
}
こんな感じで、カテゴリ名が渡されてくるので
それに応じてステータスバー更新の処理を記述します。
ただし、このメソッドは自動では呼ばれないので
ステータスバーを更新したいタイミングで呼び出す必要があります。
ここでは、カーソル位置が変更されたタイミングで呼び出してみます。
@Override
protected void handleCursorPositionChanged() {
super.handleCursorPositionChanged();
updateStatusField("categoryName");
}
このように、handleCursorPositionChanged メソッドをオーバーライドします。
これで、カーソルを動かす度にステータスバーの内容が
現在時刻で更新表示されるはずです。