Реализация компонентов с поддержкой мультиплексора
Для применения в мультиплексоре интерфейсы сайтов должны зарегистрировать альтернативную
реализацию по умолчанию с областью действия org.eclipse.ui.part.SiteMultiplexerInitializer. Поскольку
в этом случае область действия сайта расширяется, более конкретная версия
мультиплексора получает больший приоритет, чем версия по умолчанию.
Компонент, в котором применяется мультиплексор, как правило, работает в соответствии со
следующим шаблоном:
- Реализация интерфейса жизненного цикла INestedComponent;
- Добавление IMultiplexer в конструктор и обращение в его помощью к общей
версии интерфейса;
- Сохранение состояния компонента;
- Отслеживание изменения состояния дочернего объекта с обновлением сохраненного состояния;
- Каждый раз при активации компонента, он должен передавать сохраненное состояния общему интерфейсу мультиплексора;
- Пока компонент активен, он должен передавать изменения состояния
непосредственно общему интерфейсу.
В следующем примере показано, каким образом можно объединить интерфейсы 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>