2012-05-02 156 views
5

我喜歡在我的RCP應用程序中使用由Eclipse提供的導航歷史記錄。不幸的是,這個功能沒有很好的記錄事實上,我只找到這個Wiki條目:http://wiki.eclipse.org/FAQ_How_do_I_hook_my_editor_to_the_Back_and_Forward_buttons%3F在Eclipse RCP中使用導航歷史記錄

它提到每個編輯器都可以在導航歷史中標記,而不必指定位置。這正是我想要的。

無論特定編輯器是否支持導航歷史記錄,markLocation都可以使用。如果編輯器沒有實現INavigationLocationProvider,則會添加一個歷史記錄條目,允許用戶跳回到該編輯器,但不返回任何特定位置。

我將以下幾行代碼添加到我的應用程序中,以便每次打開新編輯器時添加導航條目。

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

我的問題是代碼不起作用。命令org.eclipse.ui.navigate.backwardHistoryorg.eclipse.ui.navigate.forwardHistory的工具欄圖標保持灰顯。

回答

3

我找到了解決方案。爲了在您的Eclipse RCP應用程序中使用導航歷史記錄,您必須將以下代碼行添加到您的ApplicationActionBarAdvisor

/** 
* Fills the cool bar with the main toolbars for the window. 
* <p> 
* The default implementation does nothing. Subclasses may override. 
* </p> 
* 
* @param coolBar 
*   the cool bar manager 
*/ 
protected void fillCoolBar(ICoolBarManager coolBar) { 
    IToolBarManager navigation = new ToolBarManager(SWT.FLAT); 

    IAction backward = getAction(IWorkbenchCommandConstants.NAVIGATE_BACKWARD_HISTORY); 
    IAction forward = getAction(IWorkbenchCommandConstants.NAVIGATE_FORWARD_HISTORY); 

    navigation.add(backward); 
    navigation.add(forward); 

    coolBar.add(navigation); 
} 

/** 
* Instantiates the actions used in the fill methods. Use 
* {@link #register(IAction)} to register the action with the key binding 
* service and add it to the list of actions to be disposed when the window 
* is closed. 
* 
* @param window 
*   the window containing the action bars 
*/ 
protected void makeActions(IWorkbenchWindow window) { 
    IAction backward = ActionFactory.BACKWARD_HISTORY.create(window); 
    backward.setId(IWorkbenchCommandConstants.NAVIGATE_BACKWARD_HISTORY); 
    IAction forward = ActionFactory.FORWARD_HISTORY.create(window); 
    forward.setId(IWorkbenchCommandConstants.NAVIGATE_FORWARD_HISTORY); 

    register(backward); 
    register(forward); 
} 
+0

我知道我正在挖舊帖,但你救了我的一天:)這也適用於RAP! – Jerome

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文檔沒有提到它: http://help.eclipse.org/indigo/index.jsp?topic=%2Forg.eclipse.platform.doc.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; 
    } 

    ... 
} 

第二個編輯:

我發現,每次新的編輯器通過NavigationHistory的markEditor()方法添加歷史記錄。標記在顯示線程中完成,並且直到標記過程完成後才能添加更多標記。如果要在編輯器打開後直接標記位置,則必須在顯示線程中調用markLocation()。不過,我的問題依然存在。 NavigationHistory中的後退和前進NavigationHistoryAction爲null。這就是爲什麼我的UI圖標保持灰色顯示。有人可以向我發送指定導航命令的plugin.xml部分嗎?然後我可以將其與我的配置進行比較。