Implémentation de composants de multiplexage
Afin d'être utilisées dans un multiplexeur, les interfaces de sites doivent enregistrer une implémentation par défaut alternative de portée org.eclipse.ui.part.SiteMultiplexerInitializer. Etant donné que celle-ci étend la portée du site, la version de multiplexeur la plus spécifique aura la priorité sur la version par défaut lorsqu'elle est utilisée avec un multiplexeur.
Un composant multiplexé utilisera presque toujours la procédure suivante :
- Implémentation de l'interface du cycle de vie d'un composant INestedComponent.
- Après s'être procuré un IMultiplexer chez leur constructeur, il l'utilise pour accéder à la version partagée de leur interface.
- Stockage de l'état du composant.
- Ecoute des changements chez l'enfant et mise à jour appropriée de l'état stocké.
- A chaque activation du composant, l'état stocké est transféré à l'interface partagée du multiplexeur.
- Pendant que le composant est actif, les changements d'état sont directement transférés à l'interface partagée.
L'exemple suivant montre le code utilisé par le plan de travail pour multiplexer l'interface ISelectionHandler avec ChildSelectionHandler.
/**
* Version multiplexée de l'interface ISelectionHandler
*
* @depuis 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;
// Accède à l'interface ISelectionHandler partagée en cours de multiplexage
// (nous devons uniquement la modifier lorsque nous sommes l'enfant actif)
this.parent = (ISelectionHandler)
mplex.getSharedComponents().getComponent(ISelectionHandler.class);
// Définissez l'état initial (la sélection initiale de la partie aura la
// valeur null jusqu'à ce qu'elle soit définie explicitement).
}
public IMultiplexer getMultiplexer() {
// Renvoie le multiplexeur utilisé
return multiplexer;
}
public void activate() {
// Transmet notre sélection stockée à l'interface partagée
parent.setSelection(selection);
isActive = true;
}
public void deactivate() {
isActive = false;
}
public void setSelection(ISelection newSelection) {
// Rappelez-vous la nouvelle sélection de l'enfant
selection = newSelection;
if (isActive) {
// Si nous sommes actifs, transmettez la sélection directement à
// l'interface partagée
parent.setSelection(newSelection);
}
}
}
Voici le code du point d'extension associé de 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>