實作多工元件
為了要在「多工器」中使用,網站介面需要登錄替代方案預設實作,範圍是 org.eclipse.ui.part.SiteMultiplexerInitializer。由於這會延伸網站的範圍,因此在「多工器」中使用時,多工器的版本越特定,順序就會比預設版本還優先。
多工元件幾乎一直使用下列型樣:
- 實作 INestedComponent 生命週期介面;
- 在它們的建構子中採用 IMultiplexer,並用它來存取其共用版本介面;
- 存放組件的狀態;
- 接聽子項中的狀態變更,以及適當更新存放的狀態;
- 每次啟動元件時,應該都會將存放的狀態轉遞到多工器中的共用介面;
- 當元件在作用中時,應該會直接將狀態變更轉遞到共用的介面。
下列範例示範工作台用來多工處理 ISelectionHandler 介面和 ChildSelectionHandler 的程式碼。
/**
* ISelectionHandler 介面的多工版本
*
* @自 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>