Implementowanie komponentów multipleksujących
Interfejsy serwisów muszą zarejestrować alternatywną implementację domyślną w zasięgu obiektu
org.eclipse.ui.part.SiteMultiplexerInitializer, aby mogły zostać użyte w
multiplekserze. Ponieważ rozszerza to zasięg serwisu, szczegółowiej zdefiniowane wersje multipleksera będą miały wyższy priorytet
podczas stosowania w multiplekserze niż wersja domyślna.
Multipleksowany komponent w znacznej większości przypadków działa według następującego wzorca:
- Implementowanie interfejsu cyklu życia INestedComponent.
- Pobranie obiektu IMultiplexer do własnego konstruktora oraz uzyskanie za jego pomocą dostępu do współużytkowanej
wersji interfejsu.
- Zapisanie stanu części.
- Nasłuchiwanie zmian stanu elementu potomnego i aktualizowanie przechowywanego stanu.
- Przekazywanie przechowywanego stanu do współużytkowanego interfejsu w multiplekserze przy każdym aktywowaniu
komponentu.
- Przekazywanie zmian stanu bezpośrednio do współużytkowanego interfejsu, kiedy dany komponent jest aktywny.
Poniższy przykład zawiera kod używany przez środowisko robocze do multipleksowania interfejsu ISelectionHandler
za pomocą właściwości ChildSelectionHandler.
/**
* Multipleksowana wersja interfejsu 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;
// Uzyskanie dostępu do współużytkowanego interfejsu ISelectionHandler, który jest multipleksowany (można
// go modyfikować tylko z poziomu aktywnego elementu potomnego)
this.parent = (ISelectionHandler)
mplex.getSharedComponents().getComponent(ISelectionHandler.class);
// Ustawienie stanu początkowego (początkowy wybór części będzie pusty,
// dopóki nie zostanie jawnie określony)
}
public IMultiplexer getMultiplexer() {
// Zwrot multipleksera, który utworzył element
return multiplexer;
}
public void activate() {
// Przekazanie przechowywanego wyboru do współużytkowanego interfejsu
parent.setSelection(selection);
isActive = true;
}
public void deactivate() {
isActive = false;
}
public void setSelection(ISelection newSelection) {
// Zapamiętanie nowego wyboru elementu potomnego
selection = newSelection;
if (isActive) {
// Przekazanie wyboru bezpośrednio do współużytkowanego interfejsu
// w razie aktywności
parent.setSelection(newSelection);
}
}
}
Poniżej pokazano powiązany język znaczników punktu rozszerzenia dla właściwości 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>