표시기

보기, 편집기, 마법사, 대화 상자와 같은 Workbench UI 지시문이 SWT 위지트(widget)를 사용하여 직접 구현될 수 있는 데도 표시기가 필요한 이유는 무엇일까요?  

표시기를 사용하면 모델 오브젝트를 사용하고 있는 동안에도 위지트(widget)를 작성할 수 있습니다.  SWT 위지트(widget)를 직접 사용하는 경우, 오브젝트를 SWT가 예상하는 문자열과 이미지로 변환해야 합니다.  표시기는 SWT 위지트(widget)에서 어댑터의 역할을 하여 위지트(widget) 이벤트를 처리하기 위한 공통 코드를 처리합니다(그렇지 않으면 사용자가 직접 구현해야 함). 

앞서 ReadmeSectionsView 내의 Readme 도구의 보기 지시문에서 표시기를 살펴 보았습니다.

public void createPartControl(Composite parent) {
viewer = new ListViewer(parent);
      ...
   }
참고:  표시기를 사용하여 Workbench 보기와 편집기 모두에 대해 구현을 제공할 수 있습니다. 표시기라는 용어를 사용한다고 해서 표시기가 보기 구현에만 유용하다는 의미는 아닙니다. 예를 들어, TextViewer는 여러 Workbench 및 플러그인 편집기에서의 구현에 사용됩니다.

표준 표시기

JFace는 SWT에서 중요한 대부분의 위지트(widget)에 표시기를 제공합니다. 표시기는 목록, 트리, 테이블, 텍스트 위지트(widget)에 가장 일반적으로 사용됩니다. 

각 표시기에는 연관된 SWT 위지트(widget)가 있습니다. 이 위지트(widget)는 편리한 표시기 생성자에서 상위 컴포지트를 제공하여 암시적으로 작성하거나 먼저 이를 작성하고 생성자의 표시기에 이를 제공하여 명시적으로 작성할 수 있습니다.

목록 지향 표시기

목록, 트리, 테이블은 사용자의 관점에서 여러 가지 공통 기능(예: 오브젝트로 채우기, 선택, 정렬 및 필터링)을 공유합니다. 

이 표시기는 도메인 오브젝트(요소라고 함) 목록을 보관하고 해당 SWT 위지트(widget)에 표시합니다. 목록 표시기는 목록에 있는 요소에서 텍스트 레이블을 가져올 수 있습니다.  목록 표시기는 표시기에 설정할 수 있는 ILabelProvider로부터 레이블을 얻습니다.  또한 위지트(widget) 콜백을 다시 표시기 클라이언트가 알고 있는 요소에 맵핑할 수 있습니다.

일반 SWT 위지트(widget)를 사용하는 클라이언트는 SWT 레벨에서 운영해야 합니다. 이 레벨에서 항목은 문자열이며, 이벤트가 종종 문자열 목록 내에서 색인과 관련됩니다. 표시기는 상위 레벨 시맨틱을 제공합니다. 클라이언트가 표시기에 제공한 요소를 사용하여 목록 변경사항과 선택사항이 클라이언트에 통지됩니다. 표시기는 색인을 다시 요소에 맵핑하거나 필터된 오브젝트 보기를 조정하고 필요하면 다시 정렬하는 등의 까다로운 작업을 모두 처리합니다.

필터링 및 정렬 성능은 표시기에 표시기 정렬기(ViewerSorter) 및/또는 표시기 필터(ViewerFilter)를 지정하여 처리됩니다. 목록 표시기 외에 트리 및 테이블 표시기에 대해서도 이를 지정할 수 있습니다. 클라이언트는 목록의 오브젝트를 비교하거나 필터할 수 있는 클래스만 제공하면 됩니다. 표시기는 지정된 순서와 필터에 따라 목록을 채우고, 요소가 추가되고 제거될 때 순서와 필터를 유지보수하는 세부사항을 처리합니다.

표시기는 클라이언트가 확장할 수 있도록 설계되지 않았습니다.  고유 컨텐츠 및 레이블 제공자를 사용하여 표시기를 구성하면 표시기를 사용자 정의할 수 있습니다.

ListViewer는 목록의 요소를 SWT 목록 제어에 맵핑합니다.

TreeViewer는 계층 구조 오브젝트를 SWT 트리 위지트(widget)에 표시합니다. 이 표시기는 항목을 펼치고 접기 위한 세부사항을 처리합니다. 서로 다른 SWT 트리 제어(일반 트리, 테이블 트리, 선택란 트리)에 대한 몇 가지 다른 유형의 트리 표시기가 있습니다.

TableViewer는 목록 표시기와 아주 유사하지만 테이블의 각 요소에 대해 다중 정보 열을 볼 수 있는 기능을 추가합니다.  테이블 표시기는 셀 편집 개념을 도입하여 SWT 테이블 위지트(widget) 기능을 크게 확장합니다. 특수 셀 편집기를 사용하면 사용자가 콤보 상자, 대화 상자 또는 텍스트 위지트(widget)를 사용하여 테이블 셀을 편집할 수 있습니다. 테이블 표시기는 사용자 편집을 위해 필요할 때 이들 위지트(widget)의 작성 및 배치를 처리합니다.  이는 TextCellEditorCheckboxCellEditor와 같은 CellEditor 클래스를 사용하여 수행됩니다. 가상 테이블은 볼 때만 채워지며, 테이블 표시기는 실제로 작성되는 것과 상관 없이 지정된 수의 결과만 실행합니다. 데이터베이스는 "느리게" JIT를 요구하며 한 번에 사전 결정된 수만을 조회합니다.

텍스트 표시기

텍스트 위지트(widget)는 두 번 클릭 작동, 실행 취소, 색상 표시 및 색인 또는 행순 탐색과 같은 여러 가지 공통된 시맨틱을 갖습니다.  TextViewer는 SWT StyledText 위지트(widget)의 어댑터입니다. 텍스트 표시기는 클라이언트에게 문서 모델을 제공하고 텍스트 위지트(widget)가 제공한 양식화된 텍스트 정보로의 문서 변환을 관리합니다.

텍스트 표시기에 대해서는 Workbench 편집기에 자세히 설명되어 있습니다.

표시기 아키텍처

표시기를 이해하려면 표시기의 입력 요소, 컨텐츠, 선택사항 및 표시기를 조작할 때 위지트(widget)에 실제로 표시되는 정보 간의 관계를 잘 알아야 합니다.

입력 요소

입력 요소는 표시기가 표시 또는 편집하고 있는 기본 오브젝트입니다. 표시기의 관점에서 입력 요소는 임의의 오브젝트일 수 있습니다. 입력 요소에 의해 특정 인터페이스가 구현된다고 가정하지 않습니다. 잠시 후 컨텐츠 제공자를 살펴볼 때 그 이유를 알게 됩니다.

표시기는 입력 요소 변경을 처리할 수 있어야 합니다. 새 입력 요소가 표시기에 설정되면, 새 요소에 따라 위지트(widget)를 다시 채워야 합니다. 입력 요소에서 리스너로 등록하고 요소를 기반으로 위지트(widget)를 채우는 것에 대한 시맨틱은 표시기 유형마다 다릅니다.

컨텐츠 표시기

컨텐츠 표시기는 입력 요소로부터 정보를 얻기 위한 잘 정의된 프로토콜이 있는 표시기입니다. 컨텐츠 표시기는 두 개의 특수 헬퍼 클래스(IContentProviderILabelProvider)를 사용하여 위지트(widget)를 채우고 입력 요소에 대한 정보를 표시합니다.

IContentProvider는 컨텐츠 제공자를 입력 요소와 연관시키고 입력 요소 변경을 처리하기 위해 기본 라이프 사이클 프로토콜을 제공합니다. 표시기 유형별로 보다 전문화된 컨텐츠 제공자가 구현됩니다. 가장 일반적인 컨텐츠 제공자는 IStructuredContentProvider인데, 입력 요소가 부여된 오브젝트 목록을 제공할 수 있습니다. 컨텐츠 제공자는 목록, 테이블 또는 트리 같은 목록 유형 표시기에서 사용됩니다. 일반적으로 컨텐츠 제공자는 입력 요소와 예상된 표시기 컨텐츠 간의 맵핑 방법을 알고 있습니다.

ILabelProvider는 한 단계 더 나아갑니다. 표시기 컨텐츠(입력 요소 및 컨텐츠 제공자에서 유래된)가 제공되면, 표시기에 컨텐츠를 표시하는 데 필요한 특정 UI 요소(예: 이름, 아이콘)를 작성할 수 있습니다. 레이블 제공자는 동일한 아이콘 인스턴스가 표시기의 모든 유형에 사용되도록 할 수 있기 때문에 아이콘 자원을 절약할 수 있습니다.

참고:  특정 컨텐츠 및 레이블 제공자의 인스턴스는 여러 표시기 사이에 공유되지 않습니다. 모든 표시기가 동일한 유형의 컨텐츠 또는 레이블 제공자를 사용하더라도 각 표시기는 제공자 클래스의 고유 인스턴스를 사용하여 초기화되어야 합니다. 제공자 라이프 사이클 프로토콜은 제공자와 표시기 간에 1:1 관계를 유지하도록 설계됩니다.

입력 요소, 컨텐츠 제공자, 레이블 제공자를 사용하면 표시기가 위지트(widget)를 채우기 위해 대부분의 구현 세부사항을 숨길 수 있습니다. 표시기의 클라이언트는 표시기를 올바른 유형의 입력 및 컨텐츠 제공자로 채우는 일에만 관여합니다. 레이블 제공자는 표시기 컨텐츠에서 UI 정보를 가져오는 방법을 알고 있어야 합니다.

레이블 제공자는 단지 텍스트 뿐만 아니라 그 이상과 이미지를 표시할 수 있습니다. JFace는 가장 자주 사용되는 임시 기능을 지원하기 위해 몇 가지의 클래스 및 인터페이스를 제공합니다. 다음 클래스는 TableViewer, AbstractTreeViewer 및 TableTreeViewer에서 지원됩니다.

Eclipse 3.1 현재 두 가지 방법으로 보기 색상에 영향을 줄 수 있습니다. 고유한 레이블 제공자를 사용하거나 색상 및 글꼴을 설정하는 데코레이터를 사용하는 것입니다. 일반적으로, 데코레이터는 특정 유형을 표시하는 모든 보기에 영향을 주므로 레이블 제공자에서 색상 및 글꼴 지원을 사용하는 방법이 더 좋습니다. 색상 또는 글꼴 데코레이터를 사용할 경우, 색상 및 글꼴 환경 설정 페이지에서 값을 설정할 수 있는지 확인하십시오.

표시기 및 Workbench

표시기, 컨텐츠 제공자, 레이블 제공자가 제공하는 유연성은 Workbench가 이를 사용하는 방법을 살펴 보면 알 수 있습니다.

WorkbenchContentProvider는 하위를 요청하여 입력 요소로부터 컨텐츠를 얻는 구조화된 컨텐츠 제공자입니다. 일반 기능을 구현하기 위해 어댑터 개념이 다시 사용됩니다. 입력 요소로부터 요소 목록을 요청할 때 WorkbenchContentProvider는 입력 요소에 대해 IWorkbenchAdapter를 얻습니다. IWorkbenchAdapter가 입력 요소에 대해 등록된 경우, 컨텐츠 제공자는 하위에 대해 요소를 조회할 수 있다고 가정할 수 있습니다.  WorkbenchContentProvider도 작업공간이 변경될 때 표시기를 최신 상태로 유지하는 데 필요한 작업을 수행합니다. 

WorkbenchLabelProvider는 오브젝트에서 IWorkbenchAdapter를 얻어 그 텍스트와 이미지를 찾는 레이블 제공자입니다. 레이블 제공자에 대한 개념은 특히 Workbench 오브젝트에 도움이 되는 데, 이 개념을 통해 하나의 레이블 제공자가 표시기에서 공통적으로 사용되는 이미지를 캐시할 수 있기 때문입니다. 예를 들어, WorkbenchLabelProviderIProject에 사용할 이미지를 얻으면 해당 이미지를 캐시하여 표시기에 표시된 모든 IProject 오브젝트에 사용할 수 있습니다.

공통 어댑터인 IWorkbenchAdapter를 정의하고 다수의 플랫폼 유형에 등록하면 이런 유형을 여러 공통 보기 및 이를 포함하고 있는 Workbench 보기에 올바로 표시할 수 있습니다.