Implementace multiplexních komponent
Rozhraní webu musejí pro použití v multiplexeru registrovat alternativní výchozí implementaci v rozsahu platnosti org.eclipse.ui.part.SiteMultiplexerInitializer. Protože tento rozsah překračuje rozsah webu, převezme více specializovaná verze multiplexeru při použití v multiplexeru prioritu nad výchozí verzí.
Multiplexovaná komponenta má téměř vždy tuto strukturu:
- Implementace rozhraní životního cyklu INestedComponent.
- Vložení IMultiplexer do jeho konstruktoru a použití tohoto prvku k přístupu ke sdílené verzi jeho rozhraní.
- Uložení stavu části.
- Naslouchání stavu změn v podřízeném prvku a příslušná aktualizace uloženého stavu.
- Vždy při aktivaci komponenty je zapotřebí předat uložený stav sdílenému rozhraní v multiplexeru.
- Je-li komponenta aktivní, měla by předávat změny svých stavů přímo sdílenému rozhraní.
Následující příklad uvádí kód použitý v pracovní ploše k multiplexování rozhraní ISelectionHandler s použitím ChildSelectionHandler.
/**
* Multiplexovaná verze rozhraní ISelectionHandler
*
* @od verze 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;
// Získává přístup ke sdílenému ISelectionHandler, který bude multiplexován (měli bychom
// upravovat pouze ve funkci aktivního podřízeného prvku)
this.parent = (ISelectionHandler)
mplex.getSharedComponents().getComponent(ISelectionHandler.class);
// Nastavuje výchozí stav (výchozí výběr součásti je null
// až do jeho výslovného nastavení).
}
public IMultiplexer getMultiplexer() {
// Vrací námi vytvořený multiplexer
return multiplexer;
}
public void activate() {
// Předává náš uložený výběr na sdílené rozhraní
parent.setSelection(selection);
isActive = true;
}
public void deactivate() {
isActive = false;
}
public void setSelection(ISelection newSelection) {
// Zaznamenává nový výběr podřízeného prvku
selection = newSelection;
if (isActive) {
// Jsme-li aktivní, předává výběr přímo
// na sdílené rozhraní
parent.setSelection(newSelection);
}
}
}
Následuje markup přidruženého bodu rozšíření pro 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>