인터페이스 다중화

많은 컴포지트 부분에는 활성 하위의 개념이 있습니다. 이러한 부분은 현재 활성인 하위에 동적으로 종속성을 첨부하려 할 수 있습니다.

예를 들어 탭 폴더에 상위의 하위를 배열하는 보기를 작성하려는 경우 상위는 활성 하위의 이름 및 아이콘이 자신의 이름과 아이콘과 일치하도록 설정하려 할 수 있습니다. 다음 패턴을 사용하면 이 작업을 수행할 수 있습니다.

INameable 인터페이스를 다중화함으로써 이 작업을 수행하는 것이 좋습니다.

일반적으로 멀티플렉서 패턴은 다음과 같이 작업합니다. 이 패턴은 일반적이므로 이 패턴을 지원하는 Multiplexer 클래스가 제공됩니다. org.eclipse.core.component.types 확장점을 사용하여 새 유형의 인터페이스를 제공한 클라이언트는 다중화된 버전의 인터페이스를 제공할 수도 있습니다. 다중화된 버전은 다음 작업을 수행합니다. 멀티플렉서를 사용하는 클라이언트는 각 인터페이스 다중화에 대한 세부사항을 알 필요가 없습니다. 단순히 INameable을 멀티플렉서가 부분일지라도 멀티플렉서에 첨부하고 멀티플렉서를 하위 부분이 INameable일지라도 각 하위 부분에 첨부할 수 있습니다. 다음 예제에서는 이 작업을 표시하고 멀티플렉서가 사용된 부분은 빨간색으로 강조표시됩니다. 멀티플렉서는 명시적으로 처리할 필요가 있습니다.

public class MultiplexNameView implements IDisposable {
    private Multiplexer mplex;
   
    private ISite view1;
    private ISite view2;
   
    private Listener focusListener = new Listener() {
        /* (non-Javadoc)
         * @see org.eclipse.swt.widgets.Listener#handleEvent(org.eclipse.swt.widgets.Event)
         */
        public void handleEvent(Event e) {
            if (e.widget == view1.getControl()) {
                mplex.setActivePart(view1);
            } else if (e.widget == view2.getControl()) {
                mplex.setActivePart(view2);
            }        
        }
       
    };
   
    /**
     * Component constructor. Do not invoke directly.
     */
    public MultiplexNameView(Composite parent, IPartFactory factory, INameable name) throws CoreException {
       
        // Create a multiplexer. Redirect our INameable to the multiplexer
        mplex = new Multiplexer(new ContainerContext().addInstance(INameable.class, name));
       
        // Create a resource navigator. Give the navigator a multiplexed INameable, but use
        // defaults for all of the other interfaces.
        ContainerContext viewContext1 = new ContainerContext()
            .delegateTo(INameable.class, mplex);
        view1 = factory.createView(
                IPageLayout.ID_RES_NAV, parent, viewContext1, null);
        view1.getControl().addListener(SWT.Activate, focusListener);
       
        // Create property view. Give the properties view a multiplexed INameable, but use
        // defaults for everything else.
        ContainerContext viewContext2 = new ContainerContext()
            .delegateTo(INameable.class, mplex);
        view2 = factory.createView(IPageLayout.ID_PROP_SHEET, parent, viewContext2, null);
        view2.getControl().addListener(SWT.Activate, focusListener);
       
        // Make the navigator active initially
        mplex.setActivePart(view1);
       
        parent.setLayout(new FillLayout());       
    }
   
    /* (non-Javadoc)
     * @see org.eclipse.core.component.IDisposable#dispose()
     */
    public void dispose() {
        mplex.dispose();
    }
}