Interfaces de sitio

Los argumentos del constructor de un componente se conocen como dependencias. Las dependencias de componente sustituyen los diversos adaptadores y métodos get, por ejemplo, para acceder a los IActionBars de un sitio, un componente lógico basado en componentes tomaría una instancia de IActionBars en su constructor.

Los sitios de estilo nuevo ofrecen un conjunto abierto de interfaces. Cualquier conector puede ampliar el conjunto de interfaces de sitio mediante el punto de extensión org.eclipse.core.component.types. Aunque puede ampliarse el conjunto de las interfaces de sitio, todos los sitios dan soporte al mismo conjunto, lo que asegura que cualquier componente pueda conectarse a cualquier sitio. Es posible ver el conjunto completo de interfaces de sitio utilizando la vista de registro de conector PDE.

El entorno de trabajo proporciona las siguientes interfaces de sitio:

Interfaz
Descripción
IErrorContext
Construye y anota mensajes de IStatus a las anotaciones del conector.
Paquete
El paquete de conector que contiene la implementación del componente. Informa automáticamente a otros componentes de sus conectores, como, por ejemplo, la implementación de IErrorContext.
IContainer
Contenedor del sitio. Este objeto puede consultarse para cualquiera de las demás interfaces de sitio, lo que puede ser útil si el componente quiere redirigirlo o multiplexarlo todo desde su sitio a sus hijos.
INameable
Permite que un componente establezca su nombre, icono, ayuda flotante y descripción del contenido. Sustituye los diversos métodos get y escuchas en IWorkbenchPart.
Composite
Compuesto padre para el componente. Este compuesto no es compartido con ningún otro componente y se desechará al mismo tiempo que el componente. Se permite que el componente establezca los escuchas de diseño y conexión en este compuesto.
ISecondaryId
Interfaz que devuelve el ID secundario de un componente cuando se utiliza como vista de múltiples instancias.
ResourceManager
Asigna y desasigna imágenes, fonts, colores y otros recursos SWT de forma segura. Asegura que se compartan recursos idénticos entre componentes y que se limpie cualquier fuga cuando se cierre el componente.
IDirtyHandler
Permite que los componentes se establezcan o borren su estado de suciedad.
IMessageDialogs
Muestra al usuario diálogos de error, aviso e información.
IActionBars
Sirve a la misma finalidad que getViewSite().getActionBars() hizo con la API de Eclipse 3.0.
IMultiplexer
Proporciona un componente multiplexado con acceso a su multiplexor y cualquier interfaz compartida
.
ISavedState
Mantiene el estado previamente persistido del componente.
IPartFactory
Permite que un componente cree vistas anidadas y editores.
IPartDescriptor
Mantiene metainformación acerca de un componente como, por ejemplo, su ID, título, imagen por omisión, etc.
IEditorInput
Mantiene la entrada de editor para un editor. Apunta a una entrada de editor vacía para vistas.
ISelectionHandler
Maneja cambios de selección. Los componentes pueden utilizarlo para cambiar la selección que proporcionan al entorno de trabajo.

Depende del contexto de contenido del componente para determinar si el componente obtendrá una instancia exclusiva para cada interfaz o un objeto compartido entre varios componentes. El constructor del componente no recibe nunca un argumento nulo.

 

Utilización de nuevas interfaces de sitio con componentes existentes

Aunque es conveniente la inyección de constructor, no sería práctico volver a escribir cada editor y vista existentes para utilizar la inyección de constructor con el fin de aprovechar las nuevas interfaces de sitios. Por este motivo, todas las nuevas interfaces están también disponibles en vistas existentes como adaptadores en IWorkbenchPartSite.

Existe una vista que contiene un único botón que abre un diálogo de mensaje.

Imagen de DependenciesViewOld

El ejemplo siguiente muestra el origen de una vista de estilo nuevo que abre el diálogo utilizando la nueva interfaz de IMessageDialogs.

/**
 * Muestra cómo utilizar las dependencias de componentes en un componente de estilo nuevo.
 *
 * @since 3.1
 */
public class DependenciesViewNew {
    // Dependencias
    private IMessageDialogs dialogs;
   
    /**
     * Constructor de componentes. No debe invocarse directamente.
     */
    public DependenciesViewNew(Composite parent, IMessageDialogs dialogs) {
        this.dialogs = dialogs;
       
        Button testButton = new Button(parent, SWT.PUSH);
        testButton.setText("Open a dialog");
        testButton.addSelectionListener(new SelectionAdapter() {
        /* (no Javadoc)
         * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
         */
        public void widgetSelected(SelectionEvent e) {
            openADialog();
        }
        });
    }
   
    private void openADialog() {
        dialogs.open(IStatus.INFO, "This is a message");
    }
}

Este ejemplo muestra una vista tradicional que abre un diálogo que utiliza IMessageDialogs y muestra que esto también es posible utilizando un componente de entorno de trabajo tradicional. Las líneas en font rojo muestran cómo se inicializa y se utiliza la interfaz de IMessageDialogs en cada caso.

/**
 * Muestra cómo utilizar dependencias de componente en una vista de estilo antiguo
 *
 * @since 3.1
 */
public class DependenciesViewOld extends ViewPart {
    // Dependencias
    private IMessageDialogs dialogs;
    
    // Widget principal
    private Composite parent;
    
    /* (no Javadoc)
     * @see org.eclipse.ui.IWorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite)
     */
    public void createPartControl(Composite parent) {
        this.parent = parent;
        this.dialogs = (IMessageDialogs)getSite().getAdapter(IMessageDialogs.class);
        
        Button testButton = new Button(parent, SWT.PUSH);
        testButton.setText("Open a dialog");
        testButton.addSelectionListener(new SelectionAdapter() {
        /* (no Javadoc)
         * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
         */
        public void widgetSelected(SelectionEvent e) {
            openADialog();
        }
        });
    }
    
    private void openADialog() {
        if (dialogs != null) {
            dialogs.open(IStatus.INFO, "This is a message");
        }
    }

    /* (no Javadoc)
     * @see org.eclipse.ui.IWorkbenchPart#setFocus()
     */
    public void setFocus() {
        parent.setFocus();
    }
}