Implementazione dei componenti multiplexing
Affinché possa essere utilizzato in un multiplexer, le interfacce del sito devono registrare
un'implementazione predefinita alternativa con org.eclipse.ui.part.SiteMultiplexerInitializer. Poiché in questo modo si amplia l'ambito del sito, la versione del multiplexer più specifica ha priorità
sulla versione predefinita.
Un componente multiplexing utilizzerà quasi sempre il seguente modello:
- Implementa l'interfaccia INestedComponent;
- Utilizza un IMultiplexer nel costruttore per accedere alla versione condivisa dell'interfaccia;
- Memorizza lo stato della parte;
- Rileva le modifiche dello stato nell'elemento secondario ed aggiorna lo stato memorizzato in modo appropriato;
- Ogni qual volta il componente viene attivato, inoltra lo stato memorizzato all'interfaccia condivisa nel
multiplexer;
- Quando il componente è attivo, inoltra le modifiche allo stato direttamente all'interfaccia condivisa.
Il seguente esempio mostra il codice utilizzato dal workbench per sottoporre a multiplexing l'interfaccia
ISelectionHandler con ChildSelectionHandler.
/**
* Multiplexed version of the ISelectionHandler interface
*
* @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;
// Get access to the shared ISelectionHandler being multiplexed (we should
// only modify it when we're the active child)
this.parent = (ISelectionHandler)
mplex.getSharedComponents().getComponent(ISelectionHandler.class);
// Set the initial state (the part's initial selection will be null
// until it explicitly sets it).
}
public IMultiplexer getMultiplexer() {
// Return the multiplexer we were created with
return multiplexer;
}
public void activate() {
// Forward our stored selection to the shared interface
parent.setSelection(selection);
isActive = true;
}
public void deactivate() {
isActive = false;
}
public void setSelection(ISelection newSelection) {
// Remember the child's new selection
selection = newSelection;
if (isActive) {
// If we're active, forward the selection directly to the
// shared interface
parent.setSelection(newSelection);
}
}
}
Di seguito è riportata la markup del punto di estensione per 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>