2012-05-02 12 views
5

Me gusta utilizar el historial de navegación proporcionado por Eclipse en mi aplicación RCP. Desafortunadamente esta característica no está bien documentada. De hecho, solo encontré esta entrada Wiki: http://wiki.eclipse.org/FAQ_How_do_I_hook_my_editor_to_the_Back_and_Forward_buttons%3FUsar el historial de navegación en Eclipse RCP

Menciona que cada editor se puede marcar en el historial de navegación, sin tener que especificar una ubicación. Esto es exactamente lo que quiero.

Independientemente de si el editor específico tiene algún soporte para el historial de navegación, markLocation funcionará. Si el editor no implementa INavigationLocationProvider, se agregará una entrada de historial, lo que permite al usuario retroceder a ese editor pero sin volver a ninguna ubicación en particular.

Agregué las siguientes líneas de código a mi aplicación para agregar una entrada de navegación cada vez que se abre un nuevo Editor.

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

Mi problema es que el código no funciona. Los iconos de la barra de herramientas para los comandos org.eclipse.ui.navigate.backwardHistory y org.eclipse.ui.navigate.forwardHistory permanecen atenuados.

Respuesta

3

He encontrado la solución.Para usar el Historial de navegación en su aplicación Eclipse RCP, debe agregar las siguientes líneas de código a su 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

Sé que estoy cavando publicaciones antiguas pero me salvaste el día :) ¡Esto también funciona para RAP! – Jerome

0

Gracias, he echado un vistazo a la implementación de AbstractTextEditor. Ya que sólo quiero navegar entre los editores y no entre las diferentes ubicaciones dentro de un editor, me di cuenta de que la aplicación más simple debería tener este aspecto:

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

    } 
} 

Mi problema es que todavía no funciona Espero que el fracaso deba estar en otro lugar. Tal vez me falta algo en la configuración del comando Eclipse. ¿Algunas ideas?

Editar:

El problema reside en el método markLocation() de la clase NavigationHistory. Llama al método privado addEntry(). La variable privada ignoreEntries está en mi caso establecida en 1. Es por eso que no puedo marcar ubicaciones en el historial. Por desgracia no he descubierto aún, ¿por ignoreEntries se establece en la documentación 1. El Eclipse no dice nada al respecto: 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; 
    } 

    ... 
} 

Segundo Editar:

descubrí que cada vez que un nuevo editor es abrió una entrada de historial se agrega a través del método markEditor() de NavigationHistory. La marca se realiza en el hilo de la pantalla y no puede agregar marcas adicionales hasta que finalice el proceso de marcado. Si desea marcar una ubicación directamente después de la apertura de un editor, debe llamar a markLocation() en la secuencia de visualización. Sin embargo, mi problema todavía existe. La navegación hacia atrás y hacia adelante de NavigationHistoryAction en NavigationHistory es nula. Es por eso que los íconos de mi IU permanecen atenuados. ¿Alguien puede enviarme la parte del plugin.xml donde se especifican los comandos de navegación? Entonces puedo compararlo con mi configuración.

Cuestiones relacionadas