編輯器通常有對應的內容概要畫面,它提供編輯器內容的結構化視圖並 協助使用者導覽編輯器的內容。
工作台針對這個目的提供標準概要視圖。工作台使用者使用視窗 > 顯示視圖功能表來控制何時可看見這個視圖。
因為通用 TextEditor 完全不瞭解它的文字結構,所以它無法為感興趣的概要視圖提供行為。因此,下面顯示的預設概要視圖沒什麼作用。
文字組織架構中的編輯器可以提供它們自己的內容概要畫面頁面給概要視圖。工作台要求 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(); } } }