Реализация компонентов с поддержкой мультиплексора

Для применения в мультиплексоре интерфейсы сайтов должны зарегистрировать альтернативную реализацию по умолчанию с областью действия org.eclipse.ui.part.SiteMultiplexerInitializer. Поскольку в этом случае область действия сайта расширяется, более конкретная версия мультиплексора получает больший приоритет, чем версия по умолчанию.

Компонент, в котором применяется мультиплексор, как правило, работает в соответствии со следующим шаблоном:
  1. Реализация интерфейса жизненного цикла INestedComponent;
  2. Добавление IMultiplexer в конструктор и обращение в его помощью к общей версии интерфейса;
  3. Сохранение состояния компонента;
  4. Отслеживание изменения состояния дочернего объекта с обновлением сохраненного состояния;
  5. Каждый раз при активации компонента, он должен передавать сохраненное состояния общему интерфейсу мультиплексора;
  6. Пока компонент активен, он должен передавать изменения состояния непосредственно общему интерфейсу.
В следующем примере показано, каким образом можно объединить интерфейсы ISelectionHandler и ChildSelectionHandler.
/**
 * Версия интерфейса 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;        
        // Получение доступа к общему интерфейсу ISelectionHandler
        // (вносить изменения можно только в активный дочерний объект)
        this.parent = (ISelectionHandler)
            mplex.getSharedComponents().getComponent(ISelectionHandler.class);        
                
        // Указание начального состояния (нулевое значение до тех пор,
        // пока оно не будет изменено явным образом).
    }        

    public IMultiplexer getMultiplexer() {        
        // Возврат созданного мультиплексора
        return multiplexer;        
    }

    public void activate() {        
        // Передача сохраненного выбора общему интерфейсу
        parent.setSelection(selection);        
        isActive = true;        
    }        
            
    public void deactivate() {        
        isActive = false;        
    }        

    public void setSelection(ISelection newSelection) {        
        // Сохранение нового выбора дочернего объекта
        selection = newSelection;        
        if (isActive) {        
             // Передача выбора общему интерфейсу если объект активный
               parent.setSelection(newSelection);        
        }        
    }        
}        
Ниже приведен код связанной точки расширения для 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> 
TestCompositeView