minimize

事業拡大のため、新しい仲間を募集しています。
→詳しくはこちら

エディタを開くと、ウィンドウの下の方に
行番号や上書きモードなどの情報が表示されますよね。
ここに独自エディタ用の情報を追加してみましょう。

Contributor

まずは 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 メソッドをオーバーライドします。
これで、カーソルを動かす度にステータスバーの内容が
現在時刻で更新表示されるはずです。