2012-05-02 32 views
5

Tôi thích sử dụng lịch sử điều hướng do Eclipse cung cấp trong Ứng dụng RCP của tôi. Rất tiếc, tính năng này không được tài liệu tốt. Trong thực tế, tôi chỉ tìm thấy mục nhập Wiki này: http://wiki.eclipse.org/FAQ_How_do_I_hook_my_editor_to_the_Back_and_Forward_buttons%3FSử dụng Lịch sử Điều hướng trong Eclipse RCP

Nó đề cập rằng mọi trình chỉnh sửa đều có thể được đánh dấu trong lịch sử điều hướng mà không phải chỉ định vị trí. Đây chính là điều tôi muốn.

Bất kể trình chỉnh sửa cụ thể có bất kỳ hỗ trợ nào cho lịch sử điều hướng hay không, markLocation sẽ hoạt động. Nếu trình chỉnh sửa không triển khai INavigationLocationProvider, mục nhập lịch sử sẽ được thêm vào, cho phép người dùng quay lại trình chỉnh sửa đó nhưng không quay lại bất kỳ vị trí cụ thể nào.

Tôi đã thêm các dòng mã sau đây vào ứng dụng của mình để thêm mục nhập điều hướng mỗi lần mở Trình chỉnh sửa mới.

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

Vấn đề của tôi là mã không hoạt động. Các biểu tượng trên thanh công cụ cho các lệnh org.eclipse.ui.navigate.backwardHistoryorg.eclipse.ui.navigate.forwardHistory luôn chuyển sang màu xám.

Trả lời

3

Tôi đã tìm thấy giải pháp.Để sử dụng Lịch sử Điều hướng trong ứng dụng RCP Eclipse của bạn, bạn phải thêm các dòng mã sau vào ApplicationActionBarAdvisor của mình.

/** 
* 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

Tôi biết tôi đang khai thác các bài đăng cũ nhưng bạn đã lưu ngày của tôi :) Điều này cũng phù hợp với RAP! – Jerome

0

Cảm ơn bạn, tôi đã xem xét triển khai AbstractTextEditor. Kể từ khi tôi chỉ muốn di chuyển giữa các biên tập viên và không giữa các địa điểm khác nhau bên trong một trình soạn thảo, tôi đã tìm ra rằng việc thực hiện đơn giản nhất nên xem xét như thế này:

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() { 

    } 
} 

Vấn đề của tôi là nó vẫn không hoạt động. Tôi hy vọng rằng sự thất bại phải nằm ở đâu đó khác. Có lẽ tôi đang thiếu một cái gì đó trong cấu hình lệnh Eclipse. Bất kỳ ý tưởng?

Chỉnh sửa:

Sự cố nằm trong phương thức markLocation() của lớp NavigationHistory. Nó gọi phương thức private addEntry(). Biến private ignoreEntries trong trường hợp của tôi được đặt thành 1. Đó là lý do tại sao tôi không thể đánh dấu các vị trí trong lịch sử. Đáng tiếc là tôi đã không tìm ra được nêu, tại sao ignoreEntries được thiết lập để 1. tài liệu Eclipse nói gì về nó: 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; 
    } 

    ... 
} 

Sửa Thứ hai:

tôi phát hiện ra rằng mỗi lần một trình soạn thảo mới là đã mở một mục lịch sử được thêm vào thông qua phương thức markEditor() của NavigationHistory. Việc đánh dấu được thực hiện trong chuỗi hiển thị và bạn không thể thêm các dấu hiệu nữa cho đến khi quá trình đánh dấu kết thúc. Nếu bạn muốn đánh dấu một vị trí ngay sau khi mở trình soạn thảo, bạn phải gọi markLocation() trong chuỗi hiển thị. Tuy nhiên, vấn đề của tôi vẫn tồn tại. Quay trở lại và chuyển tiếp NavigationHistoryAction trong NavigationHistory là null. Đó là lý do tại sao biểu tượng giao diện người dùng của tôi vẫn chuyển sang màu xám. Ai đó có thể gửi cho tôi một phần của plugin.xml nơi các lệnh điều hướng được chỉ định không? Sau đó, tôi có thể so sánh nó với cấu hình của tôi.

Các vấn đề liên quan