플러그인은 데코레이터를 사용하여 Workbench 보기에 나타나는 자원 및 기타 오브젝트의 이미지에 주석을 달 수 있습니다. 데코레이터는 플러그인이 기존 자원 유형에 기능을 추가할 때 유용합니다. 대부분의 표준 Workbench 보기는 데코레이션의 표시에 참여합니다.
예를 들어 PDE는 2진 프로젝트와 소스 프로젝트를 구분할 수 있는 데코레이터를 제공합니다.
com.example.helloworld 프로젝트는 네비게이터에 표시된 유일한 소스 프로젝트입니다. 다른 모든 2진 프로젝트에서 Java 프로젝트 아이콘의 왼쪽 위에 2진 데코레이터가 표시되는 방법을 참고하십시오. 이 데코레이터는 org.eclipse.ui.decorators 확장점을 사용하여 PDE에서 제공됩니다.
<extension point="org.eclipse.ui.decorators"> <decorator lightweight="true" quadrant="TOP_LEFT" adaptable="true" label="%decorator.label" icon="icons/full/ovr16/binary_co.png" state="false" id="org.eclipse.pde.ui.binaryProjectDecorator"> <description> %decorator.desc </description> <enablement> ... </enablement> </decorator> </extension>
데코레이터 구현을 제공하는 여러 가지 방법이 있습니다. 이 마크업에서는 선언적이고 간단한 데코레이터로 알려진 가장 단순한 방법을 사용합니다. 선언적이고 간단한 데코레이터가 정의되는 경우 마크업에는 데코레이터의 아이콘, 배치 및 사용 조건의 전체 설명이 포함됩니다. 선언적 데코레이터는 아이콘이 레이블을 데코레이트하는 데 사용될 때만 유용합니다. 플러그인은 데코레이터가 일반 아이콘 및 오버레이용 아이콘에 오버레이되어야 할 4분면만 지정해야 합니다. 그림처럼, PDE 2진 아이콘은 패키지 아이콘의 왼쪽 맨 위 4분면에서 오버레이됩니다.
플러그인이 아이콘뿐만 아니라 레이블 텍스트를 조작해야 하는 경우 또는 아이콘의 유형이 동적으로 결정되는 경우, 비선언적인 간단한 데코레이터를 사용할 수 있습니다. 이 경우, ILightweightLabelDecorator를 구현하는 구현 클래스를 정의해야 합니다. 지정된 클래스는 레이블에 적용되는 런타임에 접두부, 접미부 및 오버레이 이미지를 제공해야 합니다. 레이블 텍스트에서 접두부 및 접미부를 연결하고 오버레이를 수행하는 메커니즘은 배경 스레드의 Workbench 코드로 처리됩니다. 따라서 ILightweightLabelDecorator 구현의 플러그인을 통해 수행된 작업은 UI 스레드에 안전해야 합니다. (자세한 내용은 비UI 스레드에서 코드 실행 참조.)
다음 마크업에서는 이 기술을 사용하여 CVS 클라이언트가 해당 데코레이터를 정의하는 방법을 보여줍니다.
<extension point="org.eclipse.ui.decorators"> <decorator objectClass="org.eclipse.core.resources.IResource" adaptable="true" label="%DecoratorStandard.name" state="false" lightweight= "true" quadrant = "BOTTOM_RIGHT" class="org.eclipse.team.internal.ccvs.ui.CVSLightweightDecorator" id="org.eclipse.team.cvs.ui.decorator"> <description> %DecoratorStandard.desc </description> </decorator> </extension>
데코레이터는 최종적으로 Workbench 레이블 데코레이션 환경 설정 페이지를 통해 사용자에 의해 제어됩니다. 개별 데코레이터를 켜고 끌 수 있습니다. 그러한 경우에도 기존 플랫폼 SDK 데코레이터와 오버랩되거나 충돌하지 않도록 사용자 데코레이터를 디자인하는 것이 좋습니다. 복수 플러그인이 동일한 4분면에 간단한 데코레이터를 제공하는 경우 충돌은 비결정적으로 해결됩니다.
플러그인이 모든 이미지 및 자체 레이블 관리를 수행할 수도 있습니다. 이런 경우 lightweight 속성은 false로 설정되어야 하고 class 속성은 ILabelDecorator을 구현하는 클래스를 이름 지정해야 합니다. 이 클래스를 사용하여 원래 레이블의 이미지와 텍스트를 사용자 고유의 어노테이션으로 데코레이트할 수 있습니다. 사용자가 접두부, 접미부 및 단순 4분면 오버레이에 제한되지 않으므로, 융통성이 증가합니다.
데코레이터의 기타 속성은 특정 구현 스타일에 독립적입니다. label 및 description 속성은 환경 설정 대화 상자의 데코레이터 이름을 지정하고 설명하는 데 사용되는 텍스트를 지정합니다. objectClass는 데코레이터가 적용되어야 할 오브젝트의 클래스에 이름을 지정합니다. enablement 속성을 사용하여 오브젝트가 데코레이트되어야 할 조건을 설명할 수 있습니다. adaptable 플래그는 IResource에 적응되는 오브젝트도 데코레이트 여부를 나타냅니다. state 플래그는 데코레이터가 기본적으로 표시 여부를 제어합니다.
데코레이터가 연산하는 데 시간이 많이 걸리거나 혼란스런 정보를 포함하는 경우 사용자는 설정되어 있는 데코레이터를 세밀하게 조정할 수 있도록 자체 환경 설정을 제공하려 할 수 있습니다. 이러한 기법은 CVS 클라이언트에서 사용됩니다.
데코레이터 갱신 주기
데코레이션은 DecoratorManager를 사용하여 데코레이션을 제공하는 레이블 제공자를 새로 고쳐서 시작됩니다. 데코레이션 처리가 배경에서 수행되는 동안 레이블이 요청되는 시간과 데코레이션 계산에 의해 소요될 labelProviderChanged 이벤트가 만기되는 시간 사이에 기간이 있습니다. 이 시간 동안 오브젝트에 대한 데코레이션은 효율성 이유 때문에 한 번만 계산됩니다. 데코레이터가 이 시간 동안 변경되는 경우, 요소를 데코레이트하기 위한 두 번째 및 후속 호출이 무시되므로 이전 결과가 브로드캐스트될 수 있습니다.
데코레이터 제공자는 데코레이션이 발생하는 중에는 데코레이터 변경을 피해야 합니다. 이것이 불가능한 경우 labelProviderChanged가 처리된 후 요소를 데코레이트하는 두 번째 호출이 필요하게 됩니다.