org.eclipse.jface.resource 패키지는 도움말 플러그인의 UI 자원(예: 글꼴, 아이콘) 관리를 지원하는 클래스를 정의합니다.
여러 Workbench 확장점은 플러그인이 Workbench에 컨트리뷰션을 표시하는 데 사용하는 아이콘을 제공할 수 있도록 합니다. GUI 운영 체제는 메모리에서 동시에 제한된 수의 이미지나 글꼴을 지원하기 때문에 플러그인의 UI자원은 신중하게 관리되어야 하며 종종 위지트(widget) 간에 공유되어야 합니다.
Readme 도구 플러그인에서 몇 가지 아이콘 참조사항을 이미 살펴 보았습니다. 일부 아이콘은 plugin.xml 마크업에 지정됩니다.
<extension point="org.eclipse.ui.views"> <category id="org.eclipse.ui.examples.readmetool" name="%Views.category"> </category> <view id="org.eclipse.ui.examples.readmetool.views.SectionsView" name="%Views.ReadmeSections" icon="icons/view16/sections.png" category="org.eclipse.ui.examples.readmetool" class="org.eclipse.ui.examples.readmetool.ReadmeSectionsView"> </view> </extension>
이미지를 빠르게 설명하는 코드도 살펴 보았습니다. 다음의 출처는 Readme 도구의 ReadmeEditorActionBarContributor입니다.
public ReadmeEditorActionBarContributor() { ... action1 = new EditorAction(MessageUtil.getString("Editor_Action1")); action1.setToolTipText(MessageUtil.getString("Readme_Editor_Action1")); action1.setDisabledImageDescriptor(ReadmeImages.EDITOR_ACTION1_IMAGE_DISABLE); action1.setImageDescriptor(ReadmeImages.EDITOR_ACTION1_IMAGE_ENABLE); ...
JFace는 플러그인이 해당 플랫폼 그래픽 오브젝트의 작성 및 소멸 시기에 관계 없이 아이콘과 글꼴을 관리할 수 있도록 하는 기본 지원 클래스를 제공합니다. 이런 지원 클래스는 위에 표시된 플러그인에 의해 직접 사용되거나 Workbench가 이 클래스를 사용하여 확장점 마크업에 설명된 이미지를 얻을 때 간접적으로 사용됩니다.
SWT Image 클래스는 운영 체제의 관점에서 이미지를 표시합니다. 대부분의 GUI 운영 체제는 동시에 열 수 있는 이미지 수가 제한되어 있기 때문에 이미지를 작성할 때 플러그인은 세심하게 신경을 써야 하며, 이미지 사용을 완료했을 때 이미지를 적절히 처리할 수 있도록 해야 합니다. SWT 이미지 대신 JFace ImageDescriptor 및 ImageRegistry 클래스를 사용하면, 플러그인이 이미지를 직접 작성, 관리 및 처리하지 않을 수 있습니다.
ImageDescriptor 클래스를 이미지에 대한 간단한 설명으로 사용할 수 있습니다. 이 클래스는 이미지 작성에 필요한 모든 것(예: 이미지를 얻을 수 있는 파일 이름 또는 URL)을 지정합니다. ImageDescriptors는 createImage() 메소드를 사용하여 명확히 요청한 경우를 제외하고 실제 플랫폼 이미지를 할당하지 않습니다.
이미지 설명자는 모든 아이콘을 한 위치에 정의하여 필요할 때 이를 할당할 수 있도록 코드를 구조화할 때 매우 유용합니다. 또한 이미지 설명자는 OS 자원에 관계 없이 언제든 작성할 수 있으며, 따라서 모든 설명자를 초기화 코드로 편리하게 작성할 수 있습니다.
ImageRegistry 클래스는 이름 지정된 이미지 목록을 보관하는 데 사용됩니다. 클라이언트는 이미지 설명자 또는 SWT 이미지를 목록에 직접 추가할 수 있습니다. 레지스트리에서 이미지 이름이 요청되면 레지스트리는 이미지를 리턴(이미지가 작성된 경우)하거나 설명자에서 이미지를 작성합니다. 따라서 레지스트리 클라이언트가 이미지를 공유할 수 있습니다.
레지스트리에서 검색되거나 레지스트리에 추가된 이미지가 클라이언트에 의해 처리되어서는 안됩니다. 이미지는 여러 클라이언트에 의해 공유되므로 레지스트리가 이미지를 처리하게 됩니다. 레지스트리는 플랫폼 GUI 시스템이 종료되면 이미지를 처리합니다.
가능하면 플러그인 UI 오브젝트의 아이콘을 plugin.xml 파일에 지정하십시오. 여러 Workbench 확장점에는 아이콘 파일의 구성 매개변수가 포함되어 있습니다. 확장 컨트리뷰션의 아이콘을 plugin.xml에 지정하면, 플랫폼이 이미지를 관리합니다. 일반적으로 아이콘은 플러그인의 디렉토리에 보관되므로, 한 위치에서 아이콘을 지정하고 파일을 관리할 수 있게 됩니다.
기타 패턴은 아이콘을 확장 지시문의 일부로 지정할 수 없는 경우에만 고려되어야 합니다.
이미지가 자주 사용되지 않고 공유되지 않을 경우에는 명시적으로 이미지를 작성하는 것이 좋습니다. SWT에서 직접 이미지를 작성하고 사용한 후에 처리할 수 있습니다.
ImageDescriptor를 사용하고 createImage() 메소드를 호출하여 명시적으로 이미지를 작성할 수도 있습니다. 첫 번째 경우에서와 마찬가지로 더 이상 이미지가 필요 없게 된 이후에 이미지에 dispose() 메소드를 호출해야 합니다. 예를 들어, 대화 상자가 열려 있을 때 이미지가 작성되었다면 대화 상자를 닫을 때 이미지를 처리해야 합니다.
이미지가 플러그인에서 자주 사용되고 UI에서 여러 다른 오브젝트 간에 공유되면, ImageRegistry를 사용하여 이미지 설명자를 등록하는 것이 유용합니다. 레지스트리의 이미지는 동일한 이름으로 이미지를 조회하는 오브젝트와 공유됩니다. 다른 오브젝트에 의해 이미지가 공유되므로 레지스트리의 이미지를 처리해서는 안됩니다.
이미지가 자주 사용되고(플러그인 지속시간 동안 내내), 여러 오브젝트에서 공유하는 경우, 이미지 레지스트리에 이미지를 추가하는 것이 가장 좋습니다. 레지스트리를 사용할 경우의 단점은 레지스트리의 이미지가 GUI 시스템이 종료될 때까지 처리되지 않는다는 것입니다. 동시에 열 수 있는 플랫폼(SWT) 이미지 수가 제한되어 있으므로 플러그인은 레지스트리에 너무 많은 아이콘을 등록하지 않도록 해야 합니다.
AbstractUIPlugin 클래스에는 플러그인 전반에 걸친 이미지 레지스트리를 작성하기 위한 프로토콜이 포함되어 있습니다.
특정 표시기에 항목을 표시하기 위해 아이콘이 자주 사용되는 경우, 레이블 제공자를 사용하여 표시기에 유사한 항목을 공유할 수 있습니다. 레이블 제공자는 표시기의 오브젝트 이미지를 리턴하는 역할을 담당하기 때문에 표시기에서 이미지 작성 및 오브젝트 간 이미지 공유를 제어할 수 있습니다.
레이블 제공자는 앞서 설명한 기술을 사용하여 이미지를 작성할 수 있습니다. LabelProvider 서브클래스에서 다양한 getImage() 구현을 찾아보는 경우, 오브젝트에 하나의 아이콘을 캐시하고 유형별로 이미지 레이블을 유지보수하는 것을 포함하는 다양한 접근방법을 보게 됩니다. 레이블 제공자에 의해 작성된 이미지는 제공자의 dispose() 메소드로 처리되어야 하는데, 표시기가 처리될 때 이 메소드가 호출됩니다.
레이블 제공자를 사용하면 명시적 작성과 이미지 레지스트리의 장점을 모두 살릴 수 있습니다. 이미지 레지스트리 처럼 아이콘을 공유하면서도 실제 이미지 작성 및 처리에 대한 제어를 계속 유지할 수 있습니다.
플러그인을 세밀히 조정할 때 일반적으로 서로 다른 이미지 작성 패턴을 모두 실험하게 됩니다. 독립 클래스에서 이미지 작성에 관한 의사 결정을 분리하여 모든 클라이언트가 클래스를 사용하여 이미지를 얻도록 하는 것이 유용할 수 있습니다. 이런 방법으로 플러그인의 실제 성능 특성을 반영하도록 작성 순서를 조정할 수 있습니다.
ResourceManager 클래스는 설명자를 통해 이미지를 재사용하여 참조할 수 있도록 이미지에 ImageDescriptors 맵핑을 보존하는 데 사용됩니다. 레지스트리에서 설명자가 이미지를 요청하면, 레지스트리는 이미지를 리턴(이미지가 작성된 경우)하거나 설명자에서 이미지를 작성합니다. 따라서 레지스트리 클라이언트가 이미지를 공유할 수 있습니다.
맨 위 레벨 ResourceManager는 디스플레이에 작성되는 DeviceResourceManager입니다. JFaceResources.getResources() 로 정의된 ResourceManager는 DeviceResourceManager이며 맨 위 레벨 ResourceManager로 사용될 수 있습니다. DeviceResourceManager보다 라이프사이클이 더 짧은 ResourceManager가 필요한 경우, LocalResourceManager를 하위로 작성하고 작업을 완료하면 이를 처리할 수 있습니다.
DeviceResourceManager는 이를 작성하는 데 사용된 디스플레이가 처리되면 처리되므로 특수 관리 코드는 필요하지 않습니다.
관리자에서 검색되거나 관리자에 추가된 이미지를 클라이언트가 처리해서는 안됩니다. 다중 클라이언트가 이미지를 공유하므로 관리자가 이미지 처리를 담당합니다. 이미지를 보유하는 ResourceManager가 처리되면 레지스트리가 이미지를 처리합니다.
글꼴은 플랫폼 운영 체제에서 제한된 또다른 자원입니다. 글꼴의 작성 및 처리 문제는 이미지의 경우와 마찬가지로 유사한 속도/공간 상쇄가 요구됩니다. 일반적으로 글꼴은 플랫폼 종속 글꼴 이름으로 글꼴을 요청하여 SWT에서 할당됩니다.
FontRegistry 클래스는 이름별로 글꼴 테이블을 보관하며 글꼴 할당 및 처리를 관리합니다.
일반적으로 플러그인은 플랫폼 특정 이름을 사용하여 글꼴을 설명하거나 할당하지 않아야 합니다. JFace에서는 내부적으로 글꼴 레지스트리가 사용되긴 하지만 일반적으로 플러그인은 글꼴 레지스트리를 사용하지 않습니다. JFaceResources 클래스가 공통 글꼴에 액세스하는 데 사용되어야 합니다.
일반적으로 사용자는 환경 설정 페이지에서 응용프로그램의 글꼴에 대한 환경 설정을 지정할 수 있습니다. 이 경우, FontFieldEditor는 사용자로부터 글꼴 이름을 얻는 데 사용되어야 하며 FontRegistry는 글꼴을 보관하는 데 사용될 수 있습니다. FontFieldEditor는 환경 설정 페이지에서만 사용됩니다.
JFaceResources 클래스는 공통 플랫폼 글꼴과 이미지에 대한 액세스를 제어합니다. 또한 내부 글꼴 및 이미지 레지스트리를 유지보수하여 클라이언트가 이름 지정된 글꼴과 이미지를 공유할 수 있도록 합니다.
필요할 경우 이미지를 공유하기 위해 Workbench 및 기타 플러그인에서 사용되는 기술에는 여러 가지가 있습니다. JFaceResources 이미지 레지스트리는 Workbench와 플러그인 코드에 폭넓게 사용되지 않습니다.
글꼴 사용은 훨씬 단순합니다. Workbench와 대부분의 플러그인은 JFaceResources 클래스를 사용하여 논리 이름으로 글꼴을 요청합니다. 플러그인이 원하는 글꼴을 UI에서 사용할 수 있도록 getDialogFont(), getDefaultFont() 같은 메소드가 제공됩니다.