편집기에는 편집기 컨텐츠에 대한 구조화된 보기를 제공하고 편집기 컨텐츠의 탐색을 지원하는 해당 컨텐츠 아웃라이너가 있는 경우가 많습니다.
Workbench는 이런 목적으로 표준 아웃라인 보기를 제공합니다. Workbench 사용자는 창 >보기 표시 메뉴를 사용하여 이 보기를 볼 수 있는 시기를 제어합니다.
일반 TextEditor는 텍스트 구조를 알지 못하기 때문에 흥미로운 아웃라인 보기에 대한 작동을 제공할 수 없습니다. 따라서 아래 표시된 기본 아웃라인 보기는 많은 역할을 수행하지 못합니다.
텍스트 프레임워크의 편집기는 고유한 컨텐츠 아웃라이너 페이지를 아웃라인 보기에 제공할 수 있습니다. 편집기 아웃라이너는 Workbench가 IContentOutlinePage 유형 어댑터를 요청할 때 지정됩니다.
public Object getAdapter(Class required) { if (IContentOutlinePage.class.equals(required)) { if (fOutlinePage == null) { fOutlinePage= new JavaContentOutlinePage(getDocumentProvider(), this); if (getEditorInput() != null) fOutlinePage.setInput(getEditorInput()); } return fOutlinePage; } return super.getAdapter(required); }
컨텐츠 아웃라이너 페이지는 IContentOutlinePage를 구현해야 합니다. 이 인터페이스는 선택사항 변경 리스너(ISelectionProvider)에 알리는 기능을 보기(IPage)의 페이지에 작동과 결합합니다. 컨텐츠 아웃라이너는 일반적으로 JFace 표시기를 사용하여 구현됩니다. 컨텐츠 아웃라이너(ContentOutlinePage)의 기본 구현은 JFace 트리 표시기를 사용하여 아웃라인의 계층 구조 표시를 표시합니다. 이 표시는 JavaContentOutlinePage를 포함하여 다수의 구조화된 아웃라이너에 적합합니다.
페이지의 구현을 좀 더 자세히 살펴 봅시다. 위 스니펫에서 편집기로 아웃라인 페이지가 작성될 때 해당 입력 요소가 편집기의 입력 요소로 설정됩니다. 이 입력은 종종 아래 예처럼 아웃라인 페이지의 표시기로 직접 전달될 수 있습니다.
public void createControl(Composite parent) { super.createControl(parent); TreeViewer viewer= getTreeViewer(); viewer.setContentProvider(new ContentProvider()); viewer.setLabelProvider(new LabelProvider()); viewer.addSelectionChangedListener(this); if (fInput != null) viewer.setInput(fInput); }
트리 표시기 작성은 ContentOutlinePage에서 상속됩니다. 표준 레이블 제공자가 사용됩니다. 컨텐츠 제공자가 JavaContentOutlinePage 내부에 제공되며, 이 제공자는 편집기가 변경될 때마다 이를 개별 세그먼트로 구문 분석해야 합니다.
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { ... if (newInput != null) { IDocument document= fDocumentProvider.getDocument(newInput); if (document != null) { document.addPositionCategory(SEGMENTS); document.addPositionUpdater(fPositionUpdater); parse(document); } } }
텍스트는 문서 내의 세그먼트라는 범위로 구문 분석됩니다. 이 세그먼트는 아웃라인 보기에서 표시됩니다.
선택사항이 변경되면 선택된 세그먼트가 검색됩니다. 해당 오프셋이 편집기의 강조표시 범위를 설정하는 데 사용됩니다.
public void selectionChanged(SelectionChangedEvent event) { super.selectionChanged(event); ISelection selection= event.getSelection(); if (selection.isEmpty()) fTextEditor.resetHighlightRange(); else { Segment segment= (Segment) ((IStructuredSelection) selection).getFirstElement(); int start= segment.position.getOffset(); int length= segment.position.getLength(); try { fTextEditor.setHighlightRange(start, length, true); } catch (IllegalArgumentException x) { fTextEditor.resetHighlightRange(); } } }