Implementación de componentes de multiplexación
Para que puedan utilizarse en un multiplexor, las interfaces de sitio tienen que
registrar una implementación por omisión alternativa con el ámbito org.eclipse.ui.part.SiteMultiplexerInitializer. Dado que esto amplía el ámbito del sitio, la versión de multiplexor más
específica tendrá prioridad sobre la versión por omisión al utilizarse en un
multiplexor.
Un componente multiplexado utilizará casi siempre el patrón siguiente:
- Implementar la interfaz de ciclo de vida de INestedComponent;
- Tomar un IMultiplexer en su constructor y utilizarlo para acceder a la
versión compartida de su interfaz;
- Almacenar el estado del componente;
- Escuchar cambios de estado en el hijo y actualizar el estado almacenado de
la manera adecuada;
- Cada vez que se activa el componente, debe reenviarse el estado
almacenado a la interfaz compartida en el multiplexor;
- Mientras el componente esté activo, deben reenviarse los cambios de
estado directamente a la interfaz compartida.
El siguiente ejemplo muestra el código utilizado por el entorno de trabajo para
multiplexar la interfaz de ISelectionHandler con ChildSelectionHandler.
/**
* Versión multiplexada de la interfaz de ISelectionHandler *
* @since 3.1
*/
public class ChildSelectionHandler implements ISelectionHandler, INestedComponent {
private ISelectionHandler parent;
private ISelection selection;
private boolean isActive = false;
private IMultiplexer multiplexer;
public ChildSelectionHandler(IMultiplexer mplex) throws DependencyException {
this.multiplexer = mplex;
// Obtener acceso al ISelectionHandler compartido que se multiplexa (sólo
// debe modificarse cuando se es el hijo activo)
this.parent = (ISelectionHandler)
mplex.getSharedComponents().getComponent(ISelectionHandler.class);
// Establecer el estado inicial (la selección inicial del componente será el valor nulo
// hasta que se establezca de forma explícita). }
public IMultiplexer getMultiplexer() {
// Devolver el multiplexor con que fue creado
return multiplexer;
}
public void activate() {
// Reenviar la selección almacenada a la interfaz compartida
parent.setSelection(selection);
isActive = true;
}
public void deactivate() {
isActive = false;
}
public void setSelection(ISelection newSelection) {
// Recordar la nueva selección del hijo
selection = newSelection;
if (isActive) {
// Si activo, reenviar la selección directamente a la
// interfaz compartida
parent.setSelection(newSelection);
}
}
}
Éstos son los códigos del punto de extensión asociado para ChildSelectionHandler.
<extension point="org.eclipse.core.component.types">
<component
implementation="org.eclipse.ui.internal.part.services.ChildSelectionHandler"
interface="org.eclipse.ui.part.services.ISelectionHandler"
singleton="false"
initializer="org.eclipse.ui.part.SiteMultiplexerInitializer"/>
</extension>