5

RCP アプリケーションで Eclipse が提供するナビゲーション履歴を使用したいと思っています。残念ながら、この機能は十分に文書化されていません。実際、私はこの Wiki エントリのみを見つけました: http://wiki.eclipse.org/FAQ_How_do_I_hook_my_editor_to_the_Back_and_Forward_buttons%3F

場所を指定しなくても、ナビゲーション履歴ですべての編集者をマークできることが言及されています。これはまさに私が欲しいものです。

特定のエディターがナビゲーション履歴をサポートしているかどうかに関係なく、markLocation は機能します。エディターが INavigationLocationProvider を実装していない場合、履歴エントリが追加され、ユーザーはそのエディターに戻ることができますが、特定の場所に戻る必要はありません。

新しいエディターが開かれるたびにナビゲーション エントリを追加するために、次のコード行をアプリケーションに追加しました。

IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
IEditorPart editor = page.openEditor( input, MyEditor.ID );
page.getNavigationHistory().markLocation( editor );

私の問題は、コードが機能しないことです。コマンドのツールバー アイコンはorg.eclipse.ui.navigate.backwardHistoryグレーorg.eclipse.ui.navigate.forwardHistory表示のままです。

4

3 に答える 3

1

エディターでINavigationLocationProviderインターフェイスを実装する必要があります。

Eclipse グループがAbstractTextEditorでインターフェースをどのように実装したかを見ることができます。

于 2012-05-02T15:51:53.780 に答える
0

ありがとう、AbstractTextEditor の実装を調べてみました。エディター内のさまざまな場所間ではなく、エディター間のみを移動したいので、最も単純な実装は次のようになるはずだとわかりました。

public class MyEditor extends EditorPart implements INavigationLocationProvider {
public static final String ID = "MyEditor";

...

    @Override
    public INavigationLocation createEmptyNavigationLocation() {
        return new MyNavigationLocation( this );
    }

    @Override
    public INavigationLocation createNavigationLocation() {
        return new MyNavigationLocation( this );
    }
}

public class MyNavigationLocation extends NavigationLocation {

    public MyNavigationLocation( IEditorPart part ) {
        super( part );
    }

    @Override
    public boolean mergeInto( INavigationLocation location ) {
        return false;
    }

    @Override
    public void restoreLocation() {

    }

    @Override
    public void restoreState( IMemento memento ) {

    }

    @Override
    public void saveState( IMemento memento ) {

    }

    @Override
    public void update() {

    }
}

私の問題は、それがまだ機能しないことです。失敗はどこか別の場所にあるに違いないと思います。たぶん、Eclipse コマンド構成に何かが欠けているのでしょう。何か案は?

編集:

問題は、クラス NavigationHistory の markLocation() メソッドにあります。プライベート メソッド addEntry() を呼び出します。私の場合、プライベート変数 ignoreEntries は 1 に設定されています。そのため、履歴に場所をマークすることはできません。残念ながら、 ignoreEntriesが 1 に設定されている理由はまだわかりません。Eclipse のドキュメントには、それについて何も書かれていません。 .isv%2Freference%2Fapi%2Forg%2Feclipse%2Fui%2FINavigationHistory.html

/*
 * Adds a location to the history.
 */
private void addEntry(IEditorPart part) {
    if (ignoreEntries > 0 || part == null) {
        return;
    }

    ...
}

2番目の編集:

新しいエディターが開かれるたびに、NavigationHistory の markEditor() メソッドを介して履歴エントリが追加されることがわかりました。マーキングは表示スレッドで行われ、マーキング手順が終了するまでマーキングを追加することはできません。エディターを開いた直後に場所をマークしたい場合は、表示スレッドで markLocation() を呼び出す必要があります。それにもかかわらず、私の問題はまだ存在します。NavigationHistory の前後の NavigationHistoryAction は null です。そのため、UI アイコンが灰色のままになっています。ナビゲーション コマンドが指定されている plugin.xml の一部を送ってもらえますか? 次に、それを自分の構成と比較できます。

于 2012-05-04T08:07:24.213 に答える